home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Whiteline: delta
/
whiteline CD Series - delta.iso
/
dl_serie
/
news
/
188
/
gfautil4
/
gfa_util.hyp
(
.txt
)
next >
Wrap
Atari ST Guide Hypertext
|
1995-11-25
|
301KB
|
9,719 lines
Vorwort
How to use this Hypertext
Bitte an die User
Bitte an die Programmierer
Der gro
e Unbekannte
Manfred Ssykor
Peter Klasen
Neu in dieser Version
21.09.1995 (PK)
16.07.1995 (MS)
05.07.1995 (PK)
Applikationsverwaltung
appl_search()
appl_xgetinfo() (Rosin'sche Variante)
appl_getinfo() (Rosin'sche Variante)
appl_xgetinfo() (R
ger'sche Variante)
Dateiauswahl
FSEL_EXINPUT
Erweitertes fsel_exinput
Selectric
Multifileselect
Multiselect (nach R
Ereignisverwaltung
evnt_multi()
Auf Taste oder Mausklick warten (ohne Auswertung)
Auf Taste warten (mit Auswertung)
Tastenstatus ermitteln
Auf Tastendruck achten (ohne Auswertung)
GEM-Tastaturpuffer l
schen
Messagebuffer l
schen
Maustastenklick l
schen
Abfrage der Alternate-Taste
GEM-Puffer l
schen
(FORM-)INPUT
Fensterverwaltung
Formulare
MODUL Alert
Formatbeschreibung der ALERT-Strings
ALT-Datei laden
ALERT-Meldung ausgeben und auswerten
ALERT-Texte w
hrend der Programmentwicklung
ndern
lade_programm_alt
alert
change_programm_alt
ALERT-Ersatz als FUNCTION
ALERT-Ersatz als PROCEDURE
RSC im INLINE (Rosin'sche Variante)
RSC im INLINE (Ebsen'sche Variante)
Grafikfunktionen
MODUL Mouse
Defmouse
Busymouse
5Einbindung und Aufruf in eigenen Programmen
5Eigene Animationen erstellen
Busymouse Demo
Einfache Busymouse
Einfache Sanduhr
Mausposition ermitteln
Maustastenstatus ermitteln
X-Position ermitteln
Y-Position ermitteln
Mauszeiger verstecken
Mauszeiger aufdecken
SETMOUSE-Ersatz
MOUSE-Offset
Objekte
Resourceorganisation
Menushortcut ermitteln
scan_menu()
Setzen der OB_STATES und OB_FLAGS
rsc_txt_scroll
Shell-Kommunikation
X-Grafikfunktionen
Zwischenspeicher
Clipboard finden (nach Schildmann)
Clipboard finden (nach R
schen des Clipboards
Lesen einer Datei vom Clipboard
GEMDOS
QDateifunktionen
Rf_close()
Rf_out()
Rf_outw()
Rf_outl()
Rf_bput()
Rf_bget()
Rf_print()
Rf_seek()
Rf_loc()
Rf_rename()
Rf_kill()
Rf_rmdir()
Rf_mkdir()
Rf_create()
Rf_open()
Rf_update()
Rf_append()
Rf_lof()
Rf_eof()
Rf_println()
Rf_input()
Rf_bload()
Rf_bsave()
Rfile$()
Rfile.$()
Rext$()
Rpfad$()
Rpfad.$()
Rf_attr()
Rexist()
Rget_fileinfo()
Rexist_drive()
Rexist_ordner()
Rcheck_fastload()
Rset_fastload()
Rprotected()
Rgd_copy()
Rug_copy1()
Rug_copy2()
Rget_alabel$()
Rset_alabel()
Rmain_path$
Rback_up()
Rget_new_file$()
Rordner_holen$()
Rdatei_holen$()
Rdrive_blink()
Rfilename_ext$()
Rset_extend$()
Rset_extension()
Rstr_cut_file$()
Rpfad_format$()
Rfile_to_rsc$()
QDatum und Uhrzeit
QProzessfunktionen
PEXEC-Grundlagen
QSpeicherverwaltung
mxalloc()
QSystemfunktionen
QVerzeichnisfunktionen
diskinfo()
QZeichenweise Ein-/Ausgabe
Attributfunktionen
Ausgabefunktionen
v_gtext()
Auskunftsfunktionen
vq_chcells()
Eingabefunktionen
Escapefunktionen
Kontrollfunktionen
Rasterfunktionen
vdi_copy
Sauberes (S)GET und (S)PUT
Sauberes SGET (als Funktion)
Sauberes SGET (als Prozedur)
Sauberes SPUT (als Prozedur)
Sauberes GET (als Funktion)
Sauberes PUT (als Prozedur)
vdi_copy_init
scr_copy()
make_xyarray()
vro_cpyfm()
Cookies
Cookie ermitteln (nach Rosin)
Cookie ermitteln (nach R
Cookie ermitteln (nach Dunkel)
Cookie ermitteln (nach Harder)
Cookie ermitteln (nach ??)
VSCR-Cookie
Stringmanipulationen
String teilen
String einf
schen eines Teilstrings
Ersetzen in einem String (als Prozedur)
Ersetzen in einem String (als Funktion)
Abschneiden von Leerzeichen
Blocksatz
gen von Dezimalpunkten
gen von Nullen
LOWER$ = Gegenst
ck zu UPPER$
cut_left_str()
llen mit Nullen
Suchen
'Boyer Moore' Suchalgorythmus
Dateinamen suchen
Suchen in einem eindimensionalen Stringfeld
Suchen in einem Speicherbereich
Suchen (Berger'sche Variante)
Sortieren
Dateinamen sortieren
Sortieren (nach Skuplik)
Routinen rund um's Datum
Datumsroutinen
Der wievielte Tag im Jahr ist heute?
Der wievielte Tag ist heute?
Absolutes Datum -> Kalenderdatum
Welcher Wochentag ist heute?
Differenz zwischen zwei Daten
Rechnet mit Daten
Unix-Datum in echtes Datum wandeln
Zeitdifferenz berechnen
KOBASCH - KOBold-Acc-SCHnitstelle
Dokumentation zu KOBASCH
Beispiel zu KOBASCH
Module OFLS
Module KOBASCH
Prozess-Balken zeichnen
Prozess-Balken (nach Pomrehn)
Prozess-Balken (nach R
Prozess-Balken f
r die FLY-DIALS
Diverses
Ermitteln, ob das Programm im Interpreter gestartet wurde
Ermitteln, ob ein Programm als ACC gestartet wurde
uft das Programm unter MultiTOS?
GFA-VSYSNC-Befehl ersetzen
Systemfehler-Routinen aus bzw. einschalten
Tastaturpuffer l
schen
TOS-Version und -Datum ermitteln
BASEPAGE-Adresse des aktuellen Prozesses
Kalt- oder Warmstart durchf
Kommandozeile (cmd$)
INLINE 2 STRING
Farb-Register retten bzw. restaurieren
BIT-Operation
Aufruf einer Shell
Abfrage der Umschalttasten
CRC-Code berechnen
Debugger
Adressen von GFA-Prozeduren ermitteln
Primzahlen errechnen
Umwandlung: Dezimalzahl in r
mische Zahl
Umwandlung: Dezimalzahl -> 'Zahlwort'
Programmabl
ufe zeitlich begrenzen
GONG ausgeben
xPling ausgeben
Zeilenz
hler (nach Ssykor)
Zeilenz
hler (nach Dunkel)
MagiC-Unfreeze
minfrei
DMA-Sound
Druck-Routine
UFSL-Init
Falcon-Sound
lprint$()
test_printer_online() (nach R
test_printer_online() (nach Duchalski)
MODEM 2
Create Inline Assembler File
Auslesen des $m-Wertes eines Compilates
Multitask-APP???
SPLines
TOS-Cursor
Inlines
ob_spec%
cookie%
crc_code%
sanduhr%
busymouse%
boyer_adr%
ctab%
cntlines%
Andere UUE's
verybusy.uue
prozess.rsc
Protokolle
Drag & Drop (nach Lorenz)
Drag & Drop (nach R
xacc_mtosinit
Index
TOS.HYP/AES
GFA_LDG.HYP
GFA_FAQ.HYP
AOS.HYP
TOS.HYP
aip.hyp\ACC
tos.hyp\AES
aip.hyp\Adresse
aip.hyp\Alexander Lorenz
tos.hyp\Applikationsverwaltung
tos.hyp\Attributfunktionen
tos.hyp\Ausgabefunktionen
tos.hyp\Auskunftsfunktionen
tos.hyp\BIOS
tos.hyp\Bconmap
aip.hyp\Christoph Conrad
aip.hyp\Claus Brod
tos.hyp\Dateiauswahl
tos.hyp\Dateifunktionen
tos.hyp\Datum und Uhrzeit
aip.hyp\David Reitter
tos.hyp\Dcreate
aip.hyp\Doppelklick
tos.hyp\Drvmap
tos.hyp\Eingabefunktionen
tos.hyp\Ereignisverwaltung
tos.hyp\Escapefunktionen
tos.hyp\Fclose
tos.hyp\Fensterverwaltung
aip.hyp\Font-Protokoll
tos.hyp\Fopen
tos.hyp\Formulare
aip.hyp\Franz Sirl
tos.hyp\Fread
tos.hyp\Fsfirst
tos.hyp\Fwrite
tos.hyp\GEM
tos.hyp\GEMDOS
tos.hyp\Grafikfunktionen
aip.hyp\Gregor Duchalski
aip.hyp\HSMODEM
aip.hyp\Harun Scheutzow
aip.hyp\Index
aip.hyp\KILL
aip.hyp\Kobold
tos.hyp\Kontrollfunktionen
aip.hyp\MAX
aip.hyp\MC
tos.hyp\Malloc
aip.hyp\Manfred Ssykor
aip.hyp\Martin Osieka
tos.hyp\Mfree
aip.hyp\Michael Ebsen
aip.hyp\Michael Wedding
tos.hyp\Mxalloc
tos.hyp\NVDI
tos.hyp\Nachrichten
tos.hyp\Objekte
aip.hyp\Oliver Schildmann
tos.hyp\Pause
aip.hyp\Peter Klasen
tos.hyp\Pexec
tos.hyp\Prozessfunktionen
tos.hyp\Rasterfunktionen
aip.hyp\Reiner Rosin
tos.hyp\Resourceorganisation
tos.hyp\Rsconf
aip.hyp\ST-Guide
aip.hyp\Select
tos.hyp\Shell-Kommunikation
tos.hyp\Speicherverwaltung
tos.hyp\Systemfunktionen
aip.hyp\Ulf Dunkel
aip.hyp\Ulli Gruszka
tos.hyp\VDI
tos.hyp\Verzeichnisfunktionen
aip.hyp\WICHTIG
tos.hyp\X-Grafikfunktionen
tos.hyp\XBIOS
aip.hyp\XINFO
tos.hyp\Zeichenweise Ein-/Ausgabe
aip.hyp\Zeig's mir
tos.hyp\Zwischenspeicher
tos.hyp\appl_getinfo
tos.hyp\appl_search
tos.hyp\evnt_multi
tos.hyp\fsel_exinput
tos.hyp\pxyarray
tos.hyp\scrp_clear
tos.hyp\v_gtext
tos.hyp\v_hide_c
tos.hyp\v_show_c
tos.hyp\vq_chcells
tos.hyp\vro_cpyfm
aip.hyp\
Routinen rund um's GFA-Basic
:$VER: Release vom 24. September 1995 (24. September 1995)
-c -i -s +zz -t4
Programmieren/GFA-Basic
#Titel
Das Betriebssystem TOS
ATARI Operating System
Oft gestellte Fragen zum GFA-Basic
Liste des Grauens
und
lVorwort GFA-Util
Ja, hallo ersteinmal...
Wir wu
ten nicht, ob sie es schon wu
ten, aber das einzigartige GFA-
Util ist ein Kompendium, welches als Hypertext f
r den
(ST-Guide eine
Sammlung diverser GFABASIC-Routinen beinhaltet, die dem Programmierer
das Leben ein wenig erleichtern k
nnen/sollen (oder auch nich). Wieso
sollte man das Rad immer wieder auf's neue erfinden?
Viel Spa
nschen:
und
lHow to use this Hypertext GFA-Util
Wir haben uns bem
ht, die Listings in diesem Hypertext m
glichst ohne
Umbruch zu gestalten. Leider hat jedoch der
(ST-Guide (oder besser
gesagt, das
) erhebliche Schwierigkeiten, mit Zeilenl
ngen l
als 127 Zeichen umzugehen.
Um dieses Problem ein wenig zu kompensieren, haben wir uns
entschlossen, hypermegalange Zeilen umzubrechen und sie entsprechend
zu markieren. Diese sind mit #UMBRUCH ANFANG! bzw. #UMBRUCH ENDE!
geklammert. (Sorry, das ist der einzige Weg)
' #UMBRUCH ANFANG!
dieses_ist_eine_megasuperlange_zeile_die_eigentlich_keinen_
rechten_sinn_erf
llt_aber_immerhin_l
nger_als_
einhundersiebenunzwanzig_zeichen_ist_um_zu_demonstieren_
wie_der_umruch_funxioniert=2039
' #UMBRUCH ENDE!
lBitte an die User GFA-Util
Falls Ihr bemerkt, da
eine (oder mehrere) Routinen fehlerhaft sind,
postet uns das schnellstm
glich, damit diese nicht weiter verbreitet
werden.
lBitte an die Programmierer GFA-Util
Habt Ihr eine (oder mehrere) interessante Routinen f
r diese Library,
rden wir uns sehr freuen, diese in der n
chsten Version mit
ffentlichen zu d
rfen. Diese k
nnen wahlweise an
AC3 oder
@ KR geschickt werden. Wenn das per eMail
geschieht, dann bitte vorher
lpacken
d (LZH, ZIP, ARC, ZOO) und
UUEncoden, damit nicht aus versehen Zeilen umgebrochen werden.
Schanke d
r die Merkaufkeitsam.
lDer gro
e Unbekannte GFA-Util
r diese Routinen haben wir noch niemanden finden k
nnen, der sich
ffentlich bekannt hat, sie verbrochen zu haben.
Falls Du jemanden kennst, der jemanden kennt, dessen Bruder/Onkel/Opa
diese Listings geschrieben hat, dann schick' uns doch bitte
schleunigst eine Mail.
lManfred Ssykor GFA-Util
Manfred Ssykor
H
ttenstrasse 46
D-52068 Aachen
Telefon: 0241/953703
eMail: Manfred Ssykor @ AC3
manfred_ssykor@ac3.maus.de
msy@lafp.tng.oche.de
lPeter Klasen GFA-Util
Peter Klasen
Lindemannstr.25
D-40237 D
sseldorf
Telefon: 0211/678613
eMail: Peter Klasen @ KR
peter_klasen@kr.maus.de
(Selps-Potr
lNeu in dieser Version GFA-Util
2.1
2.2
2.3
l21.09.1995 (PK) GFA-Util
chz! Als mich mal wieder besonders die Langeweile plagte, habe ich
meine CAT-Messagebase mit
ber 3723 Mails zum Thema GFA-Basic
durchsucht und bin auf die ein oder andere interessante Routine
gestossen, die ich Euch nicht vorenthalten will. Insgesamt wurden ca.
30 neue Listings eingef
gt, die ich an dieser Stelle
(verst
ndlicherweise) nicht auff
hren m
chte.
Des weiteren wurde GFA-Util stark umstrukturiert und optisch ein
wenig aufgepeppt. Die GFA-Faq sowie die Liste des Grauens werden nun
von Joachim Hurst @ B gepflegt und sind somit aus der GFA-Util
verbannt worden.
Jetzt liegt's am Manni, meine sorgsam versteckten Fehler zu entdecken
und zu eliminieren ;-)
Ach ja: Fall in diesem Text hier und da mal ein 's' fehlen ollte, o
liegt da an meiner vor Zigarettenache trotzenden Tatatur ;-)
l16.07.1995 (MS) GFA-Util
Nun, was ist neu?
exist Existenz einer Datei
berpr
Neue Busymouseroutine von
,Ulli Gruszka @
DO eingebaut. Ich (Manfred) habe noch ein
paar weitere Animationen in
eingef
Da dies f
ben
tigt wird und
*Ulf Dunkel @ CLP das aber nicht
mitgepostet hat, habe ich (Manfred) das
schnell zusammengehackt.
changes Diverse kleine
nderungen am "Quellcode"
zu GFA_UTIL.HYP
l05.07.1995 (PK) GFA-Util
Peter Harder @ NF war so freundlich uns folgende Routinen zuzusenden:
)vro_cpyfm()
Das Betriebssystem TOS: AES
lAES GFA-Util
(appl_...)
(fsel_...)
(evnt_...)
(wind_...)
(form_...)
(graf_...)
(menu_...)
(objc_...)
(rsrc_...)
(shel_...)
(xgrf_...)
(scrp_...)
lApplikationsverwaltung GFA-Util
lappl_search() GFA-Util
Autor: Frank R
ger @ OS2
eFrage:
d wie bekomme ich die Namen der Accessories heraus, die aktuell
im System vorhanden sind?
eAntwort:
d Ab
4.0 (also praktisch derzeit nur unter MultiTOS und
MagiC3) mit appl_search(), etwa so:
DIM acc_namen$(50),acc_ids&(50) ! oder so ...
CLR acc_num&,ap_smode&
WHILE @
+appl_search(ap_smode&,ap_sname$,ap_stype&,ap_sid&)
IF ap_stype&=4 ! Accessory
acc_namen$(acc_num&)=ap_sname$
acc_ids&(acc_num&)=ap_sid&
INC acc_num&
ENDIF
ap_smode&=1
FOR i&=0 TO PRED(acc_num&)
PRINT "'";acc_namen$(i&);"'",acc_ids&(i&)
NEXT i&
~INP(2)
FUNCTION
+appl_search(ap_smode&,VAR ap_sname$,ap_stype&,ap_sid&)
$F%
ap_sname$=STRING$(9,0)
GCONTRL(0)=18
GCONTRL(1)=1
GCONTRL(2)=3
GCONTRL(3)=1
GCONTRL(4)=0
GINTIN(0)=ap_smode&
ADDRIN(0)=V:ap_sname$
GEMSYS
ap_sname$=CHAR{V:ap_sname$}
ap_stype&=GINTOUT(1)
ap_sid&=GINTOUT(2)
RETURN GINTOUT(0)
ENDFUNC
lappl_xgetinfo() (Rosin'sche Variante) GFA-Util
Autor:
,Reiner Rosin @ WI2
Siehe auch:
DEFINT "a-z"
ret=FN appl_xgetinfo(4,a,b,c,d)
IF has_agi=1
ALERT 1,"
,appl_getinfo vorhanden",1,"OK",ok
IF ret=0
ALERT 1,"Fkt 4 nicht|vorhanden",1,"OK",ok
ELSE
ALERT 1,STR$(a)+"|"+STR$(b)+"|"+STR$(c)+"|"+STR$(d),1,"OK",ok
ENDIF
ALERT 1,"
,appl_getinfo|nicht vorhanden",1,"OK",ok
ENDIF
FUNCTION appl_xgetinfo(type,VAR out1,out2,out3,out4)
REM
REM
REM Modul: appl_xgetinfo
REM
REM V1.0 vom 30.3.94
REM (c)
,Reiner Rosin @ WI2
REM
REM Pr
ft, ob
,appl_getinfo() (="agi") vorhanden ist und ruft es ggfs auf.
REM
REM Parameter: type = gew
nschte Subfunktion
REM out1...out4 = R
ckgabevariablen f
r agi-Ergebnisse
REM
REM R
ckgabe: flag = 0 - agi nicht vorhanden oder Subfunktion type nicht
REM implementiert
REM oder flag <> 0 - R
ckgabe der Subfunktion
REM
LOCAL flag,wert,aes&,z
IF has_agi=0 ! agi noch nicht
berpr
aes&=WORD{{GB+4}}
IF aes&>=&H400 !
ab 4.00: immer mit agi
has_agi=1
ELSE
IF aes&=&H399 !
3.99
GOSUB
,test_cookie("MagX",flag,wert)
IF flag ! Mag!X installiert
IF {{wert+8}}=&H87654321
IF {wert+8} ! AESVARS vorhanden
IF WORD{{wert+8}+42}>=&H200
has_agi=1
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
'
IF has_agi=0
IF APPL_FIND("?AGI")=0 ! Vorschlag von
-Martin Osieka
has_agi=1
ELSE IF WIND_GET(0,22360,z,z,z,z)=22360 ! WINX pr
has_agi=1
ELSE
has_agi=-1 ! kein agi vorhanden
ENDIF
'
ENDIF
ENDIF
ENDIF
IF has_agi>0
RETURN FN
,appl_getinfo(type,out1,out2,out3,out4)
ELSE
RETURN 0
ENDIF
ENDFUNC
lappl_getinfo() (Rosin'sche Variante) GFA-Util
Autor:
,Reiner Rosin @ WI2
FUNCTION
,appl_getinfo(type,VAR out1,out2,out3,out4)
REM
REM
REM Modul:
,appl_getinfo
REM
REM V1.0 vom 30.3.94
REM (c)
,Reiner Rosin @ WI2
REM
REM Binding f
,appl_getinfo
REM
REM Parameter: type = gew
nschte Subfunktion
REM out1...out4 = R
ckgabevariablen f
r agi-Ergebnisse
REM
REM R
ckgabe: flag = 0 - Subfunktion type nicht implementiert
REM oder flag <> 0 - R
ckgabe der Subfunktion
REM
GCONTRL(0)=130
GCONTRL(1)=0
GCONTRL(2)=5
GCONTRL(3)=0
GCONTRL(4)=0
GINTIN(0)=type
GEMSYS
out1=GINTOUT(1)
out2=GINTOUT(2)
out3=GINTOUT(3)
out4=GINTOUT(4)
RETURN GINTOUT(0)
ENDFUNC
lappl_xgetinfo() (R
ger'sche Variante) GFA-Util
Autor: Frank R
ger @ OS2
Siehe auch:
FUNCTION appl_xgetinfo(ap_gtype&,VAR ap_gout1&,ap_gout2&,ap_gout3&,ap_gout4&)
$F%
LOCAL back&
IF ap_version&>=&H400 OR magx_version%>=&H200 OR winx! OR APPL_FIND("?AGI")=0
GINTIN(0)=ap_gtype&
GCONTRL(0)=
,appl_getinfo&
GCONTRL(1)=1
GCONTRL(2)=5
GCONTRL(3)=0
GCONTRL(4)=0
GEMSYS
ap_gout1&=GINTOUT(1)
ap_gout2&=GINTOUT(2)
ap_gout3&=GINTOUT(3)
ap_gout4&=GINTOUT(4)
back&=GINTOUT(0)
ENDIF
IF back&=0
ap_gout1&=0
ap_gout2&=0
ap_gout3&=0
ap_gout4&=0
ENDIF
RETURN back&
ENDFUNC
lDateiauswahl GFA-Util
lFSEL_EXINPUT GFA-Util
Autor:
@ XYZ
' Aufruf von FSEL_EXINPUT...
> FUNCTION fileselect$(a$,pfad$,file$)
LOCAL f&,b&
~WIND_UPDATE(1) ! BEG_UPDATE
IF INT{ADD({ADD(GB,4)},0)}<&H140 ! Altes
#GEM/TOS...
f&=FSEL_INPUT(pfad$,file$,b&)
ELSE ! Sonst mit Titelzeile...
f&=@
,fsel_exinput(a$,pfad$,file$,b&)
ENDIF
~WIND_UPDATE(0) ! END_UPDATE
IF f&=0 OR b&=0 ! Abbruch oder Error...
RETURN ""
ENDIF
RETURN LEFT$(pfad$,RINSTR(pfad$,"\"))+file$
ENDFUNC
> FUNCTION
,fsel_exinput(a$,VAR pfad$,file$,b&)
$F%
a$=a$+CHR$(0) ! Titel
pfad$=pfad$+CHR$(0)+SPACE$(400)
file$=file$+CHR$(0)+SPACE$(150)
GCONTRL(0)=91
GCONTRL(1)=0
GCONTRL(2)=2
GCONTRL(3)=3
GCONTRL(4)=0
ADDRIN(0)=V:pfad$ ! Pfad
ADDRIN(1)=V:file$ ! Datei
ADDRIN(2)=V:a$ ! Titel
GEMSYS
pfad$=CHAR{V:pfad$} ! Pfad
file$=CHAR{V:file$} ! Dateiname
b&=GINTOUT(1) ! Abbruch=0, OK=1
RETURN GINTOUT(0) ! Fehlercode
ENDFUNC
lErweitertes
,fsel_exinput GFA-Util
Autor: Harald Ax @ ??,
@ AC3
Siehe auch '
,find_cookie()'
' LINE-A freier Fileselect-aufruf!
' Die GFA-Befehle 'FILESELECT' und 'FILESELECT #' sind LINA-A behaftet!
' Bei dieser Funtion kann IMMER ein 'Kommentar' f
r die FSEL
bergeben
' werden. Ben
tigt wird noch die Function 'suche_cookie'!
> PROCEDURE fileselect(info$,msk$,set_ext|,VAR path$,file$,button|)
' Version 3.4 vom 23.03.1993 by Harald Ax
' (
berarbeitet von
' info$ >|
berschrift, max. 30 Zeichen
' msk$ >| gew
nschte Maske (incl. Extension). Standard: "*.*"
' set_ext| >| in msk$ definierte Extension an Dateiname anh
ngen:
' 0: nicht; 1: immer; 2: nur, wenn keine eingegeben wurde
' path$ >|>Suchpfad ohne(!) Suchmaske
' file$ >|>reiner Dateiname. Der komplette Dateiname kann aus
' path$ + file$ zusammengesetzt werden.
' button| |>0: ABBRUCH angeclickt; 1: OK angeclickt;
' 2: OK angeclickt, aber kein Dateiname ausgew
' >| = Input; |> = Output; >|> Input + Output
LOCAL pos&,fpath$,gem&
' Vorarbeiten:
info$=LEFT$(info$,30) !L
ngenbegrenzung
berschrift
IF msk$=""
msk$="*.*" !Standard-Suchmaske
ENDIF
msk$=UPPER$(msk$)
ext$=MID$(msk$,RINSTR(msk$,".")+1)
' ^ Extension aus msk$ herausfiltern
set_ext|=ABS(set_ext|)
' ^ Anpassen, falls jemand mit TRUE arbeitet
path$=LEFT$(path$,RINSTR(path$,"\"))
' ^ Zur Sicherheit, falls doch eine Extension
bergeben wurde
IF path$=""
path$=home$ !Standard-Suchpfad
ENDIF
' ---Die Betriebssystemroutine aufrufen:
gem&=CARD{LONG{GB+4}}
fpath$=path$+msk$+STRING$(131,0) !Kpl. Pfad incl. Suchmaske
info$=info$+CHR$(0)
file$=file$+STRING$(21,0) !Dateiname (Vorgabe)
GCONTRL(1)=0
GCONTRL(2)=2
GCONTRL(4)=0
ADDRIN(0)=V:fpath$ !Pfad
ADDRIN(1)=V:file$ !Dateiname (Vorgabe)
IF gem&>=&H140 OR @
,find_cookie("FSEL")
GCONTRL(3)=3
ADDRIN(2)=V:info$ !Infozeile
GEMSYS 91 !
91) aufrufen
ELSE
GCONTRL(3)=2
GEMSYS 90 !FSEL_INPUT (
90) aufrufen
ENDIF
' ---Auslesen
button|=GINTOUT(1)
' ^ Ausgew
hlter Button: 0=ABBRUCH, 1=OK
file$=CHAR{ADDRIN(1)}
' ^ Ausgew
hlter Dateiname
fpath$=CHAR{ADDRIN(0)}
' ^ Ausgew
hlter Pfad incl. Suchmaske
IF button|=1 !OK angeclickt?
' -> fpath$ auftrennen in Pfad und Suchmaske
pos&=RINSTR(fpath$,"\") !Position des letzten "\"
path$=LEFT$(fpath$,pos&) !Suchpfad
IF LEN(file$)>0 !
berhaupt Dateiname angegeben?
IF set_ext|>0 !Evtl. ext$ anh
pos&=RINSTR(file$,".") !Position des letzten "."
IF pos&=0 !Kein "." im Dateiname vorhanden
file$=file$+"."
pos&=LEN(file$) !pos& anpassen
ENDIF
IF set_ext|=1 !ext$ unbedingt anh
ngen ->
file$=LEFT$(file$,pos&)+ext$ !->Ausgew
hlte Ext. abschneiden
ENDIF
' Bis hierher wurde file$ so aufbereitet, da
auch bei set_ext|=2
' die Zwangs-Extension angeh
ngt werden kann.
IF RIGHT$(file$)="." !Dateiname ohne Extension?
file$=file$+ext$ !Dateiname incl. Zwangs-Ext.
ENDIF
ENDIF
IF RIGHT$(file$)="."
' ^ Evtl. Punkt bei Dateiname ohne Ext. abschneiden
'
file$=LEFT$(file$,LEN(file$)-1)
ENDIF
ELSE !Kein Dateiname ausgew
button|=2
CLR file$
ENDIF
ENDIF
~FRE(0) !Garbage-Collection
RETURN
lSelectric GFA-Util
Autor: Frank R
ger @ OS2
Hi Selectricer!
Ich habe mich auch mal ein wenig mit der Programmierschnittstelle von
Selectric besch
ftigt und dabei folgende PROCs entwickelt, die fast
er 44 Bytes f
r DTA) ohne Speicheranforderungen auskommen! Diese
PROCs sind v
llig unsauber (gerade im Interpreter zusammengehackt;-)
aber es soll ja auch nur der Zugriff auf die cdecl-Funktionen von
Selectric demonstriert werden. Vorteil: Die
bergebenen Dateien
nnen direkt
ber FSFIRST/FSNEXT-
hnliche Funktionen aus einer DTA-
kompatiblen Struktur ausgelesen werden. Au
erdem kann man die Auswahl
auf bestimmte Dateiattribute beschr
nken.
PROCEDURE multislct_demo(pfadmaske$,vorgabe$,attrib&,max&)
LOCAL files&,dta%,dta_attrib&,pfad$,fname$,back$
CLS !igitt, aber wenn ich schon PRINT benutze... :-)
init_slct(slct_on!,multislct!)
IF slct_on!
PRINT "Selectric vorhanden und eingeschaltet ..."
IF multislct!
~WIND_UPDATE(3) !Wichtig, siehe SLCTPROG.TXT/SAMPLE.C
DIM dta%(10) !44 Bytes Pseudo-DTA
dta%=V:dta%(0)
slct_comm&=&X1001 !CMD_FILES_OUT (1) + CFG_FIRSTNEXT (8)
FILESELECT #"Mehrfache Datei
bergabe!",pfadmaske$,vorgabe$,back$
' ^^^ hier nat
rlich
'
IF LEN(back$)
pfad$=LEFT$(back$,RINSTR(back$,"\"))
IF C:slct_get_first%(L:dta%,attrib&)=0
REPEAT
INC files&
fname$=pfad$+CHAR{dta%+30}
dta_attrib&=BYTE{dta%+21}
IF BTST(dta_attrib&,4) !Ordner
fname$=fname$+"\"
ENDIF
PRINT "Name: ";fname$
' PRINT "L
nge: ";{dta%+26}
' PRINT "Attribute: ";BIN$(dta_attrib&,6)
UNTIL C:slct_get_next%(L:dta%)<>0 OR files&=max&
' wird -49, wenn keine weitere Datei vorhanden!
ELSE IF BTST(attrib&,4)
files&=1
PRINT "Name: ";pfad$
ENDIF
ELSE
PRINT "Abbruch gew
hlt!"
ENDIF
~C:slct_release_dir%() !Aufr
ERASE dta%()
PRINT "Es wurden ";files&;" Files
bergeben!"
~WIND_UPDATE(2)
ELSE
PRINT "... aber zu alt f
r diese Demo!"
ENDIF
ELSE
PRINT "Selectric nicht vorhanden oder ausgeschaltet!"
ENDIF
RETURN
PROCEDURE init_slct(VAR slct_on!,multislct!)
LOCAL slct_version%,slct_adr%
CLR slct_on!,multislct!
IF @
+get_cookie("FSEL",slct_adr%)
IF slct_adr%>0 AND EVEN(slct_adr%)
IF MKL$(LPEEK(slct_adr%))="SLCT"
'
' Konfig-WORD (Long-Variable, da unsigned):
slct_config%=CARD{slct_adr%+6}
'
' Selectric ON/OFF?:
slct_on!=BTST(slct_config%,0)
'
IF slct_on!
'
' Version im BCD-Format:
slct_version%=CARD{slct_adr%+4}
'
' cdecl-Funktionen erst ab Selectric 1.02
multislct!=slct_version%>=&H102
'
IF multislct!
'
' Kommunikations-WORD (Direktzugriff per ABSOLUTE):
ABSOLUTE slct_comm&,slct_adr%+22 !GLOBAL
'
' Zeiger auf get_first():
slct_get_first%={slct_adr%+36}
' Aufruf: rueck%=C:slct_get_first%(L:dta%,attrib&)
'
' Zeiger auf get_next():
slct_get_next%={slct_adr%+40}
' Aufruf: rueck%=C:slct_get_next(L:dta%)
'
' Zeiger auf release_dir():
slct_release_dir%={slct_adr%+44}
' Aufruf: rueck%=C:slct_release_dir%()
'
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN
Zur Weiterentwicklung freigegeben :-)
Das ganze mu
noch richtig ausgearbeitet werden (Funktionen mit
ckgabewerten, Sammeln der
bergebenen Dateinamen in einem
Stringarray o.
., Alternativfunktionen, wenn slct_on!=FALSE oder
multislct!=FALSE, Speicherschutz, Fehlerbehandlung usw.)! Evtl. mu
man auch die Compileroption $C+ setzen (ich wei
nicht, ob A3-A6
ndert werden)!
lMultifileselect GFA-Util
Autor:
,Reiner Rosin @ WI2
DEFINT "a-z"
RESERVE 100000 ! Speicher freigeben (it's unsauber, ich wei
-> hier
' ! nurDemo!))
GOSUB multi_fileselect("Mach hin!","E:\*.IMG","TEST.IMG",10)
PROCEDURE multi_fileselect(titel$,pfad$,datei$,anzahl)
' Multi-Fileselect
' V1.0 vom 25.12.1992
' ********* modifiziert f
*Zeig's mir!*****
' Aufgabe: gestattet es, zusammen mit
mehrere Dateien zu
' selektieren
' Parameter:
' titel$ . Titelzeile in der Fileselectbox, wie bei FILESELECT
' pfad$ . Pfad und Maske, wie bei FILESELECT
' datei$ . Vorbelegung, wie bei FILESELECT
' anzahl . Anzahl max. zul
ssiger Dateien
LOCAL flag,fsel_struct,z$,z2$,p,z,n2,ram,n
' Einschr
nkungen in der aktuellen Version
' - max 120 Dateien selektierbar, denn viel mehr als 120*256=30720
' passen nicht in einen String
' (im Desktop k
nnen Pfadnamen bis zu ^^^ 256
' Byte lang werden)
' - die Anzahl der Selektierungen ist auf 120 beschr
' selektiert man also 20 Ordner + 130 Dateien, dann
' bleiben effektiv u.U. nur 120 - 20 (Ordnerzahl) = 100 Dateien
'
brig!
anzahl=MIN(anzahl,120)
,test_cookie("FSEL",flag,fsel_struct)
IF flag
IF LPEEK(fsel_struct)=CVL("SLCT")
IF BTST(DPEEK(fsel_struct+6),0)
flag=1
ELSE
flag=0
ENDIF
ELSE
flag=0
ENDIF
ENDIF
IF flag=0
GOSUB fileselect(titel$,pfad$,datei$,z$,ok)
IF ok
@add_liste(z$)
ENDIF
ELSE
'
DPOKE fsel_struct+22,3
DPOKE fsel_struct+30,120
'
@malloc(0,32000,32000,ram,z)
z2$=SPACE$(32000)
IF ram>0
BMOVE VARPTR(z2$),ram,32000
LPOKE fsel_struct+32,ram
GOSUB fileselect(titel$,pfad$,datei$,z$,ok)
BMOVE ram,VARPTR(z2$),32000
GOSUB mfree(ram)
ELSE
IF debug ! -Deb
PRINT CHR$(7); ! -Deb
GOSUB output_infofenster(19,"Riskanter FILESELECT!") ! -Deb
ENDIF ! -Deb
LPOKE fsel_struct+32,VARPTR(z2$)
@fileselect(titel$,pfad$,datei$,z$,ok)
ENDIF
n=DPEEK(fsel_struct+30)
'
IF ok=1
IF n>0
GOSUB zerlege_dateiname(z$,pfad$,z$)
p=1
n2=0
REPEAT
z=INSTR(z2$,CHR$(32),p)
z$=MID$(z2$,p,z-p)
WHILE RIGHT$(z$,1)=CHR$(0)
z$=LEFT$(z$,LEN(z$)-1)
WEND
p=z+1
INC n2
GOSUB add_liste(pfad$+z$)
UNTIL n2>=n OR n2=anzahl
ELSE
GOSUB add_liste(z$)
ENDIF
ENDIF
ENDIF
RETURN
PROCEDURE fileselect(titel$,pfad$,datei$,VAR auswahl$,button)
' Kam irgendwann mal in einer Maus-Mail
LOCAL puffer,gem_v,flag,fsel_struct
INLINE puffer,190
GOSUB sie("FSEL",flag,fsel_struct)
CHAR{puffer}=pfad$
CHAR{puffer+140}=LEFT$(datei$,19)
CHAR{puffer+160}=LEFT$(titel$,29)
gem_v=CARD{LONG{GB+4}} !
#GEM-Version
' ---Initialisieren + Aufrufen der Fileselectbox
GCONTRL(1)=0
GCONTRL(2)=2
GCONTRL(4)=0
ADDRIN(0)=puffer
ADDRIN(1)=puffer+140
IF ((gem_v>=&H140 AND gem_v<&H200) OR gem_v>&H300) OR flag<>0
GCONTRL(3)=3
ADDRIN(2)=puffer+160
GEMSYS 91 !Entspricht FILESELECT#...
ELSE
GCONTRL(3)=2
GEMSYS 90 !Entspricht FILESELECT ...
ENDIF
' ---Auslesen der Fileselectbox
button=GINTOUT(1) !Ausgangs-Button
GOSUB zerlege_dateiname(CHAR{ADDRIN(0)},auswahl$,datei$)
auswahl$=auswahl$+CHAR{ADDRIN(1)}
RETURN
PROCEDURE zerlege_dateiname(file$,VAR pfad$,datei$)
LOCAL z
REM
REM Zerlegt einen hierarchischen Dateinamen in seine Bestandteile
REM (Zugriffspfad und Dateiname)
REM
REM V1.0 vom 25.12.1990
z=RINSTR(file$,"\")
pfad$=LEFT$(file$,z)
datei$=MID$(file$,z+1)
RETURN
PROCEDURE malloc(which_ram,min,max,VAR speicher,anzahl)
' Achtung: Abweichung bei which_ram vom mxalloc des Betriebssystems!!!
' which_ram: 0 = egal, keine Preferenz
' 1 = _nur_ ST-Ram (DMA-Transfer!)
' min, max : mindestens <min>, aber nicht mehr als <max> reservieren!
LOCAL st_ram,tt_ram,puffer,nn
puffer=MALLOC(16000) ! 16000 Bytes freihalten
nn=MIN(
#MAX(MALLOC(-1),min),max)
speicher=MALLOC(nn)
IF speicher=0
anzahl=0
ELSE
anzahl=nn
ENDIF
VOID MFREE(puffer)
RETURN
PROCEDURE mshrink(ram,belegt)
(74,0,L:ram,L:belegt)
RETURN
PROCEDURE mfree(ram)
~MFREE(ram)
RETURN
PROCEDURE add_liste(a$)
' hier geht der Punk ab
PRINT a$
RETURN
lMultiselect (nach R
ger) GFA-Util
Autor: Frank R
ger @ OS2
Anmerkung: Der FILESELECT-Aufruf sollte nat
rlich durch was sauberes
ersetzt werden (
())!
slct_test
PROCEDURE slct_test
init_slct
IF slct_on!
~WIND_UPDATE(3)
' PRINT "
vorhanden und eingeschaltet!"
DIM dta%(10)
dta%=V:dta%(0)
slct_comm&=&X1001
FILESELECT #"Mehrfache
Datei
bergabe!",CHR$(
(25)+65)+":"+DIR$(0)+"\","",back$
PRINT "Pfad: ";LEFT$(back$,RINSTR(back$,"\"))
gf&=C:slct_get_first%(L:dta%,&X100111)
IF gf&=0
REPEAT
PRINT "Attribute: ";BIN$(BYTE{dta%+21},6)
PRINT "L
nge: ";{dta%+26}
PRINT "Name: ";CHAR{dta%+30}
gn&=C:slct_get_next%(L:dta%)
UNTIL gn&
ENDIF
~C:slct_release_dir%()
~WIND_UPDATE(2)
ELSE
PRINT "
nicht vorhanden oder ausgeschaltet!"
ENDIF
RETURN
PROCEDURE init_slct
IF @
+get_cookie("FSEL",slct_adr%)
fsel!=TRUE
IF slct_adr%>0 AND EVEN(slct_adr%)
IF MKL$(LPEEK(slct_adr%))="SLCT" !LPEEK, falls gesch
tzter Speicher!
slct!=TRUE
slct_version%=CARD{slct_adr%+4}
multislct!=slct_version%>=&H102
' Im Klartext:
slct_version$=STR$(slct_version% DIV 256)+"."
slct_version$=slct_version$+RIGHT$("0"+STR$(slct_version% AND
255),2)
'
' Konfig-Schalter:
slct_config%=CARD{slct_adr%+6}
'
'
ON/OFF:
slct_on!=BTST(slct_config%,0)
'
'
ausschalten:
' CARD{slct_adr%+6}=BCLR(CARD{slct_adr%+6},0)
' Einschalten:
' CARD{slct_adr%+6}=BSET(CARD{slct_adr%+6},0)
'
' Versteckte Dateien anzeigen:
slct_hidden!=BTST(slct_config%,1)
'
' Ordner mit
+Doppelklick
ffnen:
slct_dclick!=BTST(slct_config%,2)
'
' Kleinbuchstaben benutzen:
slct_lower!=BTST(slct_config%,3)
'
' Numerisches
slct_numsrt!=BTST(slct_config%,4)
'
' Im Zielpfad bleiben:
slct_stdest!=BTST(slct_config%,6)
'
' TOS-Pfade sichern:
slct_pthsav!=BTST(slct_config%,7)
'
' Uhrzeit bei Dateien von heute:
slct_todaytime!=BTST(slct_config%,8)
'
' Sortiermodus (s. Doku):
slct_sort&=INT{slct_adr%+8}
'
' Anzahl der Extensions:
slct_num_ext&=INT{slct_adr%+10}
'
' Zeiger auf ein Zeigerfeld (Extensions):
slct_ext%={slct_adr%+12}
'
' Anzahl Pfade:
slct_num_paths&=INT{slct_adr%+16}
'
' Zeiger auf ein Zeigerfeld (Pfade):
slct_paths%={slct_adr%+18}
'
' Kommunikations-Wort (wichtig f
r Mehrfachselektion!):
ABSOLUTE slct_comm&,slct_adr%+22
'
' ABSOLUTE slct_in_count&,slct_adr%+24 !z.Zt. nicht benutzt
' slct_in_ptr%={slct_adr%+26} ! "
'
' Hier schreibst Du die Anzahl der erwarteten Files rein
' und liest am Ende die Anzahl der wirklich
bergebenen
' Files aus:
ABSOLUTE slct_out_count&,slct_adr%+30
'
' Zeiger auf Zeigerfeld bei Mehrfachselektion (mu
auf einen von
' Dir reservierten Speicherbereich zeigen):
ABSOLUTE slct_out_ptr%,slct_adr%+32
'
' 3 Zeiger auf C-Funktionen. Aufruf wahrscheinlich mit C:...
' (Reihenfolge der Parameter evtl. umgekehrt?)
'
' Zeiger auf get_first(dta%,attrib&):
slct_get_first%={slct_adr%+36}
' Aufruf: rueck%=C:slct_get_first%(),L:dta%,attrib&
'
' Zeiger auf get_next(dta%):
slct_get_next%={slct_adr%+40}
' Aufruf: rueck%=C:slct_get_next(),L:dta%
'
' Zeiger auf release_dir():
slct_release_dir%={slct_adr%+44}
' Aufruf: rueck%=C:slct_release_dir%()
'
' Setzen der
'Adresse dta% z.B. so:
' DIM dta%(10) ! 11*4 = 44 Bytes DTA-Puffer
' dta%=V:dta%(0)
'
ENDIF
ENDIF
ELSE
fsel!=FALSE
slct!=FALSE
ENDIF
RETURN
lEreignisverwaltung GFA-Util
levnt_multi() GFA-Util
Autor: Peter Harder @ NF
Hier mal einige Standardproceduren, die die Arbeit mit EVNT_MULTI f
bestimmte Aufgaben etwas vereinfachen. Ich habe sie bei mir einfach
kurz mal ausgeschnitten, vielleicht sind vor dem Einsetzen in ein
eigenes Programm noch ein paar kleine Anpassungsarbeiten n
Verschiedene EVNT-Puffer l
schen ganz oder teilweise l
schen
lAuf Taste oder Mausklick warten (ohne Auswertung) GFA-Util
Autor: Peter Harder @ NF
PROCEDURE evnt_wait
LOCAL back&
' Nur auf Taste oder Mausklick warten
' ohne diese auszuwerten
~WIND_UPDATE(3)
back&=EVNT_MULTI(&X11,&H101,3,0,0,0,0,0,0,0,0,0,0,0,0,0)
IF BTST(back&,1)=TRUE ! Maustaste gedr
REPEAT
UNTIL @
&mousek=0
@
*clr_button
ENDIF
~WIND_UPDATE(2)
RETURN
lAuf Taste warten (mit Auswertung) GFA-Util
Autor: Peter Harder @ NF
PROCEDURE evnt_tast(VAR m_x&,m_y&,m_k&,ascii&,scan&,
(w_tasten&)
~WIND_UPDATE(3) ! kann hier je nach Einsatzart auch raus
2' #UMBRUCH ANFANG!
back&=EVNT_MULTI(&X11,&H101,3,0,0,0,0,0,0,0,0,0,0,0,0,0,
m_x&,m_y&,m_k&,
(w_tasten&,tast&,clicks%)
0' #UMBRUCH ENDE!
,mouse_offset(m_x&,m_y&)
IF BTST(back&,0) ! Taste gedr
m_k&=0
ascii&=BYTE{V:tast&+1}
scan&=BYTE{V:tast&}
@
(w_tasten(w_tasten&,alternate!,shift!,control!) ! VAR 3
'
ELSE
ascii&=0
scan&=0
(w_tasten&=
$BIOS(11,-1)
@
(w_tasten(w_tasten&,alternate!,shift!,control!) ! VAR 3
ENDIF
~WIND_UPDATE(2) ! evtl.raus?
RETURN
lTastenstatus ermitteln GFA-Util
Autor: Peter Harder @ NF
PROCEDURE w_tasten(w_tasten&,VAR alternate!,shift!,control!)
IF BTST(w_tasten&,0)=TRUE OR BTST(w_tasten&,1)=TRUE
shift!=TRUE
ELSE
shift!=FALSE
ENDIF
control!=BTST(w_tasten&,2)
alternate!=BTST(w_tasten&,3)
RETURN
lAuf Tastendruck achten (ohne Auswertung) GFA-Util
Autor: Peter Harder @ NF
Wird h
ufig ben
tigt, um eine l
ngerdauernde Operation durch eine
Tastendruckabfrage zu beenden. Trotz EVNT_MULTI relativ schnell, da
wegen der Dummy-Taste nicht auf den Timer gewartet werden mu
, falls
kein Tastendruck erfolgt war.
Beispiel:
IF @keylook>0
abbruch!=true
ENDIF
FUNCTION keylook
$F%
LOCAL back&,tast&,v&,v%
~WIND_UPDATE(3)
KEYPRESS 255
2' #UMBRUCH ANFANG!
back&=EVNT_MULTI(&X100001,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,5,v&,v&,v&,v&,tast&,v%)
0' #UMBRUCH ENDE!
~WIND_UPDATE(2)
IF tast&=255 OR back&=32 ! Timer oder Dummytaste?
RETURN 0 ! Es ist keine Taste gedr
ckt worden
ELSE
@
*clr_keybuf(TRUE)
RETURN tast& ! Tastaturcode zur
ENDIF
ENDFUNC
lGEM-
GFA-Util
Autor: Peter Harder @ NF
PROCEDURE clr_keybuf(anz&)
' anz&=TRUE (-1) ==> komplett l
schen
' anz&=FALSE (0) ==> nicht l
schen
' anz&>0 ==> Anzahl Tastendr
cke l
schen
LOCAL back&,zaehler&
~WIND_UPDATE(3)
IF anz&<>0
REPEAT !l
sche
#GEM Tastaturpuffer
INC zaehler&
back&=EVNT_MULTI(&X100001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5)
UNTIL back&=32 OR zaehler&=anz&
ENDIF
~WIND_UPDATE(2)
RETURN
lMessagebuffer l
schen GFA-Util
Autor: Peter Harder @ NF
PROCEDURE clr_message
' Ereignis l
schen
~WIND_UPDATE(3)
~EVNT_MULTI(&X110000,&H101,3,0,0,0,0,0,0,0,0,0,0,0,0,5)
~WIND_UPDATE(2)
RETURN
lMaustastenklick l
schen GFA-Util
Autor: Peter Harder @ NF
PROCEDURE clr_button
' Maustastenklick l
schen
~WIND_UPDATE(3)
~EVNT_MULTI(&X100010,&H101,3,0,0,0,0,0,0,0,0,0,0,0,0,5)
~WIND_UPDATE(2)
RETURN
lAbfrage der Alternate-Taste GFA-Util
Autor: Peter Harder @ NF
Gibt TRUE zur
ck, falls die Taste Alternate beim Aufrufen der
Funktion gedr
ckt war. Wird h
ufig ben
tigt, um eine beim
Programmstart automatisch aufgerufene Funktion zu unterdr
cken, wie
z.B. beim Programm ERGO oder CAT.
Beispiel:
IF @alternate_gedrueckt=FALSE
@batch_ausf
ENDIF
FUNCTION alternate_gedrueckt
$F%
LOCAL w_tst&,v&,v%
~WIND_UPDATE(3)
2' #UMBRUCH ANFANG!
~EVNT_MULTI(&X100011,&H101,3,0,0,0,0,0,0,0,0,0,
0,0,0,0,v&,v&,v&,w_tst&,v&,v%)
0' #UMBRUCH ENDE!
~WIND_UPDATE(2)
RETURN BTST(w_tst&,3) ! 0 = Alternate nicht gedr
' -1 = Alternate gedr
ENDFUNC
lGEM-Puffer l
schen GFA-Util
Autor:
0Gregor Duchalski @ DO
' GEM-Puffer l
schen...
> PROCEDURE
+clr_message ! Wait for NO message-event
WHILE BTST(EVNT_MULTI(&X110000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3),4)
WEND
RETURN
> PROCEDURE clr_key ! Wait for NO keyboard-event
WHILE BTST(EVNT_MULTI(&X100001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50),0)
WEND
RETURN
> PROCEDURE
*clr_button ! Wait for NO button-event
LOCAL a&,mb&
REPEAT
~EVNT_MULTI(&X100010,256+1,3,0,0,0,0,0,0,0,0,0,0,0,0,1,a&,a&,mb&,a&,a&,a&)
UNTIL mb&=0
WHILE BTST(EVNT_MULTI(&X100010,1,1,1,0,0,0,0,0,0,0,0,0,0,0,3),1)
WEND
WHILE BTST(EVNT_MULTI(&X100010,1,2,2,0,0,0,0,0,0,0,0,0,0,0,3),1)
WEND
RETURN
l(FORM-)INPUT GFA-Util
Autor: Peter Harder @ NF
Meine INPUT-Routine ist schon etwas
lter und nicht mehr auf der H
der Zeit. So wird die Variable eing$ noch als globale Variable
verarbeitet. Die Abbruchbedingungen werden ebenfalls global
ckgegeben (in_key$, scan_ret&, scan&, ascii&, m_k&). Die Variable
in_key$ ist noch ein uraltes Relikt aus den Zeiten von GFA 2.0 und
ist mit dem R
ckgebewert von dem Befehl INKEY$ identisch. Mein Input
kann auch durch Pfeil auf/ab, Undo und einen Maustastendruck hin
verlassen werden. Durch den Tiefstrich sieht der Befehl sehr
#GEM-
hnlich aus. Bei mir funktioniert zwar alles gut, f
r die
Allgemeinheit m
ten die Proceduren aber noch
berarbeitet und
kommentiert werden. Ein Beilegen der Routinen halte ich aber f
wichtig, die gerade das fehlende Input viele Gelegenheits
programmierer mit wenig Zeit am patchen hindert.
FUNCTION form_input$(laenge&,string$)
form_input!=TRUE
eing$=string$
~WIND_UPDATE(3)
@gem_input(CRSCOL,CRSLIN,laenge&) ! braucht eing$
~WIND_UPDATE(2)
eing$=LEFT$(eing$,len&)
form_input!=FALSE
RETURN eing$
ENDFUNC
FUNCTION input(laenge&,zahl#)
eing$=@str$(zahl#)
~WIND_UPDATE(3)
@gem_input(CRSCOL,CRSLIN,laenge&) ! braucht eing$
~WIND_UPDATE(2)
RETURN VAL(eing$)
ENDFUNC
PROCEDURE gem_input(p_x&,p_y&,len_max&)
' eing$ wird als Globale Variable
bergeben und zur
ckgegeben!!!
LOCAL c_pos&,raus!,u$
u$=STRING$(len_max&,"_")
len&=LEN(eing$)
c_pos&=len&
eing$=eing$+RIGHT$(u$,len_max&-len&)
REPEAT
@
%hidem
PRINT AT(p_x&,p_y&);eing$;
l_x&=(p_x&+c_pos&)*8-8
GRAPHMODE 3
LINE l_x&,p_y&*16-15,l_x&,p_y&*16+1
@
%showm
@
)evnt_tast(m_x&,m_y&,m_k&,ascii&,scan&,
(w_tasten&) ! VAR 6
@
%hidem
LINE l_x&,p_y&*16-15,l_x&,p_y&*16+1
@
%showm
GRAPHMODE 1
EXIT IF scan&=97 OR m_k&=2
'
IF LEN(in_key$)=1
'
IF ASC(in_key$)=27 ! ESC
eing$=LEFT$(u$,len_max&)
len&=0
c_pos&=0
'
ELSE IF ASC(in_key$)=8 ! Backspace
IF c_pos&>0
eing$=LEFT$(eing$,c_pos&-1)+MID$(eing$,c_pos&+1)+"_"
DEC c_pos&
DEC len&
ENDIF
'
ELSE IF ASC(in_key$)=127 ! Delete
IF c_pos&<len&
eing$=LEFT$(eing$,c_pos&)+MID$(eing$,c_pos&+2)+"_"
DEC len&
ENDIF
'
ELSE IF ASC(in_key$)=13 ! Return
raus!=TRUE
'
ELSE IF INSTR("0123456789,.-",in_key$) OR form_input!=TRUE
IF in_key$=","
IF form_input!=FALSE
in_key$="."
ENDIF
ENDIF
IF len&<len_max&
eing$=LEFT$(eing$,c_pos&)+in_key$+MID$(eing$,c_pos&+1,len_max&-1-c_pos&)
INC c_pos&
INC len&
ELSE
OUT 2,7 ! @beep
ENDIF
'
ELSE IF tg_k!=TRUE
raus!=TRUE
ENDIF
'
ELSE IF LEN(in_key$)=2
IF ASC(RIGHT$(in_key$))=75 ! Pfeil links
IF c_pos&>0
DEC c_pos&
ENDIF
ELSE IF ASC(RIGHT$(in_key$))=77 ! Pfeil rechts
IF c_pos&<len&
INC c_pos&
ENDIF
ELSE IF ASC(RIGHT$(in_key$))=97 ! Undo
raus!=TRUE
ELSE IF tg_k!=TRUE
raus!=TRUE
ENDIF
ELSE IF tg_k!=TRUE
raus!=TRUE
ELSE IF m_k&=2
raus!=TRUE
ENDIF
UNTIL raus!
scan_ret&=scan&
scan&=0
RETURN
lFensterverwaltung GFA-Util
Hier steht noch nix!
lFormulare GFA-Util
lMODUL Alert GFA-Util
Autor:
*Ulf Dunkel @ CLP
Mit diesem Modul lassen sich ALERTs leicht in einer externen Datei
verwalten. Dadurch kann...
der Anwender diese Fehlertexte in Grenzen seinem Geschmack
anpassen,
der Programmierer die Fehlertexte leichter pflegen,
der Programmierer Fehlertexte mit (momentan 2) variablen Texten
benutzen.
Ich schlage vor, zum Programm einen SYS-Ordner anzulegen, in dem sich
alle vom Programm ben
tigten Dateien befinden, z.B. PROGRAMM.RSC,
PROGRAMM.INF, und eben auch PROGRAMM.ALT - die Alerttexte.
Die ALT-Datei mu
ziemlich zu Anfang des Programms geladen werden,
damit auch Fehlermeldungen, die schon im Initialisierungsteil des
Programms auftreten k
nnen, mit @
() ausgegeben werden k
nnen.
Deshalb sollte die ALT-Datei z.B. auch vor der RSC-Datei geladen
werden.
lFormatbeschreibung der ALERT-Strings GFA-Util
#nnn bbb [s][1..30|1..30|1..30|1..30|1..30][1..10|1..10|1..10]
# Zeiger, da
diese Zeile g
ltig ist
nnn Fehler-Nummer, rechtsb
ndig, max. 3-stellig, mit f
hrenden
Nullen!
bbb Button-Status f
r drei verschiedene Programmzust
nde. Momentan
benutze ich selbst nur den ersten Status, es ist aber durch
diese drei Zahlenwerte leicht m
glich, auch eine 3-Button-
Alertbox je nach Programmkontext mit einem anderen Default-
Button zu zeigen.
Beispiel: bbb=312
- Status 1 = Button 3 ist DEFAULT-Button
- Status 2 = Button 1 ist DEFAULT-Button
- Status 3 = Button 2 ist DEFAULT-Button
s Symbol f
r ALERT-Box (0 = Nichts, 1 = Rufzeichen,
2 = Fragezeichen, 3 = Stopschild)
1..30 Es folgen dann nach
#GEM-Norm max. 5 Zeilen
max. 30 Zeichen
ALERTBOX-Text.
1..10 max. 3 Button-Texte
max. 10 Zeichen. Der l
ngste Button-Text
gibt die Breite der Buttons (und ggf. der Alertbox) vor.
lALT-Datei laden GFA-Util
ge einfach die Funktion @
im Initialisierungsteil
des Programmtextes an der entsprechenden Stelle ein. Die ben
tigten
Variablen sind ausf
hrlich in der Funktion beschrieben. Zeilen, die
nicht mit # beginnen, werden ignoriert.
lALERT-Meldung ausgeben und auswerten GFA-Util
An der gew
nschten Programmstelle einfach den Befehl mit der
nschten Fehlernummer einf
gen, ggf. mit einem oder den beiden
variablen Texten. Beispiele (vorab wird die entspr. in der ALT-Datei
stehende Zeile gezeigt):
#001 222 [2][Programm|beenden?][Beenden| Abbruch ]
GOSUB
(1,1,"","")
#100 111 [0][%s1 Dateien auf|Laufwerk %s2 |l
schen?][L
schen| Abbruch ]
GOSUB
(100,1,STR$(gefundene_dateien&),"A:")
lALERT-Texte w
hrend der Programmentwicklung
ndern GFA-Util
ge die Zeile @
als erste Zeile in Dein Programm
ein und REMme sie. Wenn Du einen Fehlertext
ndern willst, entREMme
diese Zeile und starte Dein Programm. So kannst Du bequem vor dem
chsten Programmstart einen, mehrere oder alle ALT-Datei-Zeilen
ndern oder pr
fen. Die Prozedur ist ausreichend gut dokumentiert,
kurzes Ausprobieren d
rfte die Arbeitsweise rasch n
herbringen.
llade_programm_alt GFA-Util
> FUNCTION lade_programm_alt
' RETURN: FALSE, wenn zu wenig Speicher oder Datei falsch, sonst TRUE
' ======
' GLOBAL al_text$() !Feld f
r den ben
tigten ALERT-String
' GLOBAL al_but&() !Feld f
r 3 verschiedene Button-Codes,
' !siehe Formatbeschreibung des ALERT-Strings
' GLOBAL programm_alt$ !Dateiname mit Pfad
' GLOBAL pfad_sysdaten$ !Zugriffspfad f
r SYS-Dateien=SYS-Ordner
' GLOBAL prg$ !Programm-Name ohne Endung
' GLOBAL alt$ !Datei-Endung f
r Alert-Datei, mit Punkt
' GLOBAL sys$ !Name des SYS-Ordners ohne Pfad
LOCAL
$ !Dateiname ohne Pfad
LOCAL button| !R
ckgabewert der Alertbox(en)
LOCAL foo% !Parameter-Dummy
LOCAL al_cnt% !Anzahl gelesene Zeilen%
LOCAL al_nr& !Nummer des Fehlertextes
LOCAL i% !Laufvariable
$=prg$+alt$
alert_suchen_nochmal:
IF NOT EXIST(programm_alt$)
' ALERTBOX VOR @alert_in
2' #UMBRUCH ANFANG!
ALERT 3,
$+" nicht gefunden.|Es mu
in einem Ordner|namens "+
sys$+" sein.",1,"
| Ende ",button|
0' #UMBRUCH ENDE!
SELECT button|
CASE 1 !SUCHEN
'
2' #UMBRUCH ANFANG!
@fileselect(FALSE,suche$+
$,"*"+alt$,pfad_sysdaten$,
$,programm_alt$,foo%)
0' #UMBRUCH ENDE!
'
GOTO alert_suchen_nochmal
CASE 2 !ABBRUCH
RETURN FALSE !Unbedingter Programmabbruch
' END !Ende !END reicht ggf. aus
ENDSELECT
ENDIF
al_cnt%=@zeilenzaehler(programm_alt$)
IF al_cnt%=0
RETURN FALSE !Unbedingter Programmabbruch
ENDIF
~GRAF_MOUSE(busybee&,0) !MAUS-Cursor
ERASE al_text$(),al_but&() !Sicher ist sicher...
DIM al_text$(al_cnt%),al_but&(al_cnt%) !Lese-Feld und Button_feld
OPEN "i",#1,programm_alt$ !Datei
ffnen,
RECALL #1,al_text$(),TRUE,al_cnt% !einlesen
CLOSE #1 !und wieder zumachen.
INSERT al_text$(0)="" !F
r OPTION BASE 1 REMmen
FOR i%=0 TO al_cnt% !Alle Zeilen durch
IF LEFT$(al_text$(i%))="#" !Nur mit "#" Alerttext:
al_nr&=VAL(MID$(al_text$(i%),2)) !fo_a_error_number
' ----------------------------------------!
al_but&(al_nr&)=VAL(MID$(al_text$(i%),6)) !fo_adefbttn
' ----------------------------------------!
al_text$(al_nr&)=TRIM$(MID$(al_text$(i%),10)) !fo_astring
ENDIF
NEXT i%
RETURN TRUE
ENDFUNC
lalert GFA-Util
> FUNCTION alert(fehler&,butcode&,al_var_1$,al_var_2$)
' RETURN: Nummer des vom User gedr
ckten Alert-Buttons
' ======
' EXTERN fehler& !Nummer des Fehler-Strings
' EXTERN butcode& !Defaultbutton-Status, momentan immer 1, siehe auch
' !Formatbeschreibung des Alert-Strings
' EXTERN al_var_1$ !String, der in den Fehlertext ab %s1 eingef
gt wird.
' EXTERN al_var_2$ !String, der in den Fehlertext ab %s2 eingef
gt wird.
LOCAL al_var_1& !Pointer auf 1. variablen Fehlertext
LOCAL al_var_2& !Pointer auf 2. variablen Fehlertext
LOCAL text$
LOCAL button| !R
ckgabewert der Alertbox(en)
LOCAL var_1$ !Platzhalter f
r 1. variablen Fehlertext
LOCAL var_2$ !Platzhalter f
r 2. variablen Fehlertext
LOCAL var_lang& !L
nge von var_1$/var_2$
LET var_1$="%s1"
LET var_1$="%s2"
LET var_lang&=LEN(var_1$)
' al_but&() enth
lt drei Buttoncodes f
r den DEFAULT-Button,
' wobei durch Aufruf mit butcode& der gew
nschte gew
hlt wird.
al_var_1&=INSTR(al_text$(fehler&),var_1$)
SELECT al_var_1&
CASE 0
2' #UMBRUCH ANFANG!
button|=FORM_ALERT(VAL(MID$(STR$(al_but&(fehler&)),
butcode&,1)),al_text$(fehler&))
0' #UMBRUCH ENDE!
DEFAULT
al_var_2&=INSTR(al_text$(fehler&),var_2$)
SELECT al_var_2&
CASE 0
text$=LEFT$(al_text$(fehler&),PRED(al_var_1&))
text$=text$+al_var_1$+MID$(al_text$(fehler&),al_var_1&+var_lang&)
button|=FORM_ALERT(VAL(MID$(STR$(al_but&(fehler&)),butcode&,1)),text$)
DEFAULT
text$=LEFT$(al_text$(fehler&),PRED(al_var_1&))
'
2' #UMBRUCH ANFANG!
text$=text$+al_var_1$+MID$(al_text$(fehler&),al_var_1&+
var_lang&,al_var_2&-al_var_1&-var_lang&)
0' #UMBRUCH ENDE!
'
text$=text$+al_var_2$+MID$(al_text$(fehler&),al_var_2&+var_lang&)
button|=FORM_ALERT(VAL(MID$(STR$(al_but&(fehler&)),butcode&,1)),text$)
ENDSELECT
ENDSELECT
RETURN button|
ENDFUNC
lchange_programm_alt GFA-Util
> PROCEDURE change_programm_alt !-!PP
' LOCAL alt$() !Feld f
r die Alerttext-Zeilen
LOCAL datei$ !Dateiname der Alerttexte mit Pfad
LOCAL i% !Laufvariable
LOCAL j& !Laufvariable
LOCAL nnn% !Anzahl gelesene Zeilen
LOCAL in$ !Vom Programmierer gew
nschte Fehlernummer
LOCAL default& !Nummer des Default-Alertbuttons
LOCAL button| !R
ckgabewert der Alertbox(en)
LOCAL loop& !Anzahl Durchlauf-Schleifen bei Anzeige ALLER Texte
LOCAL max_alt& !Max.-Anzahl Fehlertext-Zeilen
' *****
' Hier kommt der Name DEINER .ALT-Datei hin!
datei$="K:\MS\SYS\MAILSERV.ALT"
' *****
LET max_alt&=150
OPEN "i",#1,datei$
ERASE alt$() !Sicher ist sicher
DIM alt$(PRED(max_alt&))
RECALL #1,alt$(),max_alt&,nnn%
CLOSE #1
LOCATE 1,1 !Dirty Ausgabe vor Programmstart...
ALERT 2,"Welche Fehlertexte
ndern?",2,"Alle|Einzelne",button|
SELECT button|
CASE 1 !Alle
ALERT 2,"Anzahl Durchg
nge|je Fehlertext?",1,"1|2| 3 ",loop&
FOR i%=0 TO PRED(max_alt&) !OPTION BASE 0
CLS
FOR j&=1 TO loop&
LOCATE 1,1
FORM INPUT 255 AS alt$(i%)
default&=VAL(MID$(alt$(i%),6,1))
button|=FORM_ALERT(default&,MID$(alt$(i%),10))
MID$(alt$(i%),6,3)=STRING$(3,STR$(button|))
NEXT j&
NEXT i%
CASE 2 !einzelne
CLS
LOCATE 1,1
PRINT "Welchen Fehlertext
ndern (Abbruch mit [ 0 ] oder[ -1 ]) ";
FORM INPUT 3 AS in$
i%=VAL(in$)
EXIT IF i%<1 !Abbruchbedingung erf
DEC i% !wegen OPTION BASE 0 Fehlernummer DECreasen...
LOCATE 1,4
FORM INPUT 255 AS alt$(i%)
default&=VAL(MID$(alt$(i%),6,1))
button|=FORM_ALERT(default&,MID$(alt$(i%),10))
MID$(alt$(i%),6,3)=STRING$(3,STR$(button|))
LOOP UNTIL i%=-1
CASE 3
in$=""
ENDSELECT
IF VAL(in$)=0
OPEN "o",#1,datei$
STORE #1,alt$(),max_alt&
CLOSE #1
ENDIF
ERASE alt$() !Kann wieder weg...
RETURN
lALERT-Ersatz als FUNCTION GFA-Util
Autor:
/Michael Wedding @ AC3
ALERT durch FORM_ALERT ersetzen! N
tzlich f
r Programmierer, die sich
schlecht an die Syntax des FORM_ALERT gew
hnen k
nnen. Auch
interessant zum Anpassen bereits fertiggestellter Programme.
' Aufruf: ALERT-Syntax wie bisher, aber letzen Wert nach vorn holen,
' dann alles hinter ALERT in Klammern setzen.
/Michael Wedding, Apr 03 1991
2' #UMBRUCH ANFANG!
DEFFN
(icon|,box$,but|,but$)=
FORM_ALERT(but|,"["+STR$(icon|)+"]["+box$+"]["+but$+"]")
0' #UMBRUCH ENDE!
lALERT-Ersatz als PROCEDURE GFA-Util
Autor:
/Michael Wedding @ AC3
ALERT durch FORM_ALERT ersetzen! N
tzlich f
r Programmierer, die sich
schlecht an die Syntax des FORM_ALERT gew
hnen k
nnen. Auch
interessant zum Anpassen bereits fertiggestellter Programme.
' Aufruf: ALERT-Syntax wie bisher, aber alles hinter ALERT in Klammern setzen.
/Michael Wedding, Apr 03 1991
> PROCEDURE
(ic|,boxtxt$,but|,buttext$,VAR back_alert|)
back_alert|=FORM_ALERT(but|,"["+STR$(ic|)+"]["+boxtxt$+"]["+buttext$+"]")
RETURN
lRSC im INLINE (Rosin'sche Variante) GFA-Util
Autor:
,Reiner Rosin @ WI2
INLINE rsc1,32000
INLINE rsc2,1524
z=rsc2-rsc1
IF z<>32000 AND z<>32016
ALERT 1,"RSC-Error",1,"Abruch",ok
EDIT
ENDIF
[...]
PROC rsrc_conv()
[...]
r_rs=CARD{ADD(r_ra,&H22)} ! L
nge des INLINEs /* Rosin 12.6.94
IF r_rs>0
IF r_buf! ! RSC Daten puffern (nur Interpreter)...
DIM rsc_buf|(r_rs)
r_pa=ADD({*rsc_buf|()},4)
'
IF r_rs<32000 ! /* Rosin 12.6.94
BMOVE r_ra,r_pa,r_rs ! /* Rosin 12.6.94
ELSE ! /* Rosin 12.6.94
BMOVE r_ra,r_pa,32000 ! /* Rosin 12.6.94
BMOVE r_ra+32016,r_pa+32000,r_rs-32000 ! /* Rosin 12.6.94
ENDIF ! /* Rosin 12.6.94
'
r_ra=r_pa
ENDIF
[...]
Im Interpreter mu
die RSC sowieso umkopiert werden und im Compilat
landen die INLINEs direkt hintereinander. Man mu
nur Gregors
FlyDials etwas anpassen, rsrc_conv() kommt an einigen Stellen nicht
mit Werten >32767 zurecht (zumindest war das in der V4.7 so).
lRSC im INLINE (Ebsen'sche Variante) GFA-Util
Autor:
-Michael Ebsen @ WHV
eFrage:
d Gibt es eine M
glichkeit, INLINEs, die gr
er als 32750 Bytes
sind in GFA-Basic einzubinden (um dann das RSC nicht mehr
nachladen zu m
ssen)?
eAntwort:
d Ja gibt es. Im Programmcode muss folgendes stehen :
' rsc-speicher
' --V9X
INLINE rsc_inl2%,32000
INLINE rsc_inl3%,3600
z%=SUB(rsc_inl3%,rsc_inl2%)
IF z%<>32000 AND z%<>32014 ! Achtung dieser Abstand kann bei anderen
' Interpretern als 3.5E oder 3.6 TT anders
' sein
ALERT 1,"RSC-Error",1,"Abbruch",dummy&
END
ENDIF
' --V9X
Dazu geh
rt eine Routine rsrc_conv, die die RSC-Koordinaten umwandelt
> FUNCTION rsrc_conv(l.ra%)
.| Glob. Var.: fint!
.| Felder : rsc_buf&()
.| Aufruf in : rsc_laden-1,
' ***************************************************************
' rsrc_conv : wandelt RSC koordinaten und pointer um, die in
' INLINE-Befehlen enthalten sind.
' INPUT : l.ra% = RSC-INLINE-adresse
' f_int! = TRUE > RSC-daten buffern (nur bei INTERPRETER)
' ***************************************************************
LOCAL l.pa%,l.o%,l.t%,l.obj%,l.no%,l.nt%,l.rs%,l.napt%,l.gb%,l.of%,l.ns%
LOCAL l.ni%,l.adr%,l.i%
' l.pa% pufferadresse
' l.o%,l.t% laufvar
' l.obj% beginn des objekt feldes
' l.no% anzahl OBJECTS
' l.nt% anzahl TREES
' l.rs% laenge RSC-datenbereich
' l.napt% neue TREE-TABLE-adresse
' l.gb% adr. des
-Global-feldes
' l.of% objekt-feld
' l.ns% anzahl der freien strings
' l.ni% anzahl der freien images
' l.adr%,l.i% hilfsvar., laufvar.
l.rs%=CARD{l.ra%+&H22}
' pruefen,ob rsc_buf|() nicht schon dimensioniert ist (=> FEHLER + ABBRUCH)
' --OEF
IF fint! AND DIM?(rsc_buf&())>0
RETURN FALSE
ENDIF
' --OEF
' nur, wenn INLINE nicht leer und rsc-buf|() noch nicht
' dimensioniert worden ist
' RSC-daten buffern (nur bei INTERPRETER)
' --OEF
IF fint!
DIM rsc_buf&((l.rs%/2)+2) ! RSC-puffer
l.pa%=V:rsc_buf&(0) ! Puffer-adresse
IF l.rs%<=32000 ! RSC <= 32000
BMOVE l.ra%,l.pa%,l.rs% ! RSC kopieren
ELSE ! >32000 dann Beide INLINES
' moven
BMOVE l.ra%,l.pa%,32000 ! RSC kopieren
BMOVE ADD(l.ra%,32014),ADD(l.pa%,32000),SUB(l.rs%,32000)
ENDIF
l.ra%=l.pa% !neue RSC-adresse
ENDIF
' --OEF
' neue adresse der TREE-tabelle
l.napt%=l.ra%+CARD{l.ra%+&H12}
' adr. des
-global-feldes~
l.gb%={GB+4}
neue tabellenadresse zuweisen
{l.gb%+10}=l.napt%
' bisheriger start des objekt-feldes
l.obj%=CARD{l.ra%+2}
' neue startadr. des objekt-feldes
l.of%=l.ra%+l.obj%
' anzahl der objekte im file -1
l.no%=CARD{l.ra%+&H14}-1
' anzahl der TREEES im file -1
l.nt%=CARD{l.ra%+&H16}-1
FOR l.o%=0 TO l.no% ! alle objekte
' koordinaten umrechnen'
~RSRC_OBFIX(l.of%,l.o%)
SELECT BYTE(OB_TYPE(l.of%,l.o%))
'
' zeiger auf struktur mit 3 zeigern -TEDINFO bzw. ICONBLK
' (TEXT,BOXTEXT,FTEXT,FBOXTEXT,ICON)
'
CASE &H15,&H16,&H1D,&H1E,&H1F
IF EVEN(OB_SPEC(l.of%,l.o%))
OB_SPEC(l.of%,l.o%)=OB_SPEC(l.of%,l.o%)+l.ra%
{OB_SPEC(l.of%,l.o%)}={OB_SPEC(l.of%,l.o%)}+l.ra%
{OB_SPEC(l.of%,l.o%)+4}={OB_SPEC(l.of%,l.o%)+4}+l.ra%
{OB_SPEC(l.of%,l.o%)+8}={OB_SPEC(l.of%,l.o%)+8}+l.ra%
ENDIF
'
' zeiger auf struktur mit 2 zeigern - APPLBLK
' (PROGDEF)
'
CASE &H18
OB_SPEC(l.of%,l.o%)=OB_SPEC(l.of%,l.o%)+l.ra%
{OB_SPEC(l.of%,l.o%)}={OB_SPEC(l.of%,l.o%)}+l.ra%
{OB_SPEC(l.of%,l.o%)+4}={OB_SPEC(l.of%,l.o%)+4}+l.ra%
'
' zeiger auf struktur mit 1 zeiger - BITBLK
' (IMAGE)
'
CASE &H17
OB_SPEC(l.of%,l.o%)=OB_SPEC(l.of%,l.o%)+l.ra%
{OB_SPEC(l.of%,l.o%)}={OB_SPEC(l.of%,l.o%)}+l.ra%
'
' zeiger auf datenstruktur - C-text
' (BUTTON,STRING.TITLE)
'
CASE &H1A,&H1C,&H20
OB_SPEC(l.of%,l.o%)=OB_SPEC(l.of%,l.o%)+l.ra%
'
ENDSELECT
NEXT l.o%
' ap_tree-tabelle aktualisieren
FOR l.t%=0 TO l.nt% ! alle baeume
{l.napt%+(4*l.t%)}={l.napt%+(4*l.t%)}+l.ra%
NEXT l.t%
' FREE_STRINGS-tabelle aktualisieren
l.ns%=CARD{l.ra%+&H1E}-1
IF l.ns%>-1
l.adr%=l.ra%+CARD{l.ra%+&HA}
FOR l.i%=0 TO l.ns%
{l.adr%+(4*l.i%)}={l.adr%+(4*l.i%)}+l.ra%
'
NEXT l.i%
ENDIF
' FREE_IMAGEs-tabelle aktualisieren
l.ni%=CARD{l.ra%+&H20}-1
IF l.ni%>-1
l.adr%=l.ra%+CARD{l.ra%+&H10}
FOR l.i%=0 TO l.ni%
{l.adr%+(4*l.i%)}={l.adr%+(4*l.i%)}+l.ra%
'
' pointer in BITBLK relozieren
'
{{l.adr%+(4*l.i%)}}={{l.adr%+(4*l.i%)}}+l.ra%
'
NEXT l.i%
ENDIF
RETURN TRUE
ENDFUNC
lGrafikfunktionen GFA-Util
lMODUL Mouse GFA-Util
Autor:
*Ulf Dunkel @ CLP
' MODUL MOUSE
' ===========
PROCEDURE
%mouse(type&,adr%)
' INTENT: Mauscursor-Form
ndern (mit Ber
cksichtigung von Multitasking-
' GLOBAL multi_aes!
' EXTERN type&
' EXTERN adr%
IF multi_aes!
SELECT type&
CASE arrow& !Maus wieder normal
~GRAF_MOUSE(type&,adr%)
DEFAULT
~GRAF_MOUSE(&H8000 OR type&,adr%) !Mausform puffern und
ndern
ENDSELECT
ELSE
~GRAF_MOUSE(type&,adr%)
ENDIF
RETURN
PROCEDURE
&mousek(val&)
' INTENT: wartet auf bestimmten Mausbutton-Status
LOCAL mk_state&
LOCAL foo&
~GRAF_MKSTATE(foo&,foo&,mk_state&,foo&)
LOOP UNTIL mk_state&=val&
RETURN
FUNCTION mousebutton
$F%
' INTENT: pr
ft aktuellen Mausbutton-Status
' RETURN: aktueller Mausbutton-Status
LOCAL mk_state&
~GRAF_MKSTATE(foo&,foo&,mk_state&,foo&)
RETURN mk_state&
ENDFUNC
PROCEDURE mouse_userdef
' GLOBAL alle hier genannten Variablen
INLINE disk%,74
INLINE drucker%,74
INLINE kaffee%,74
INLINE
INLINE mem1%,74
INLINE mem2%,74
INLINE mem3%,74
INLINE mem4%,74
INLINE uhr1%,74
INLINE uhr2%,74
INLINE uhr3%,74
INLINE uhr4%,74
INLINE uhr5%,74
INLINE uhr6%,74
INLINE uhr7%,74
INLINE uhr8%,74
INLINE tast%,74
@mouse_defmouse(diskbild&,diskmask&,7,7,disk%)
@mouse_defmouse(drucbild&,drucmask&,7,7,drucker%)
@mouse_defmouse(kaffbild&,kaffmask&,7,7,kaffee%)
@mouse_defmouse(sandbild&,sandmask&,7,7,
@mouse_defmouse(mem1bild&,mem1mask&,7,7,mem1%)
@mouse_defmouse(mem2bild&,mem1mask&,7,7,mem2%)
@mouse_defmouse(mem3bild&,mem1mask&,7,7,mem3%)
@mouse_defmouse(mem4bild&,mem1mask&,7,7,mem4%)
@mouse_defmouse(uhr1bild&,uhrmaske&,7,7,uhr1%)
@mouse_defmouse(uhr2bild&,uhrmaske&,7,7,uhr2%)
@mouse_defmouse(uhr3bild&,uhrmaske&,7,7,uhr3%)
@mouse_defmouse(uhr4bild&,uhrmaske&,7,7,uhr4%)
@mouse_defmouse(uhr5bild&,uhrmaske&,7,7,uhr5%)
@mouse_defmouse(uhr6bild&,uhrmaske&,7,7,uhr6%)
@mouse_defmouse(uhr7bild&,uhrmaske&,7,7,uhr7%)
@mouse_defmouse(uhr8bild&,uhrmaske&,7,7,uhr8%)
@mouse_defmouse(tastbild&,tastmask&,7,7,tast%)
RETURN
PROCEDURE mouse_defmouse(bild&,mask&,xcoord&,ycoord&,adr%)
' GLOBAL CONST r_frimg& !OBJ-# f
r freie Bit-Images
' EXTERN bild& !Mauscursor-Daten-Objektnummer
' EXTERN mask& !Maskendaten-Objektnummer
' EXTERN xcoord& !X-Koordinate des Aktionspunktes (HotSpot)
' EXTERN ycoord& !Y-Koordinate des Aktionspunktes (HotSpot)
' EXTERN adr% !Pointer auf INLINE-String
LOCAL i| !Z
hlvariable
LOCAL user_def$ !Pufferstring f
r Mauscursor-Daten
LOCAL bild_adr% !
'Adresse des FREE_IMAGE (Mauscursor)
LOCAL mask_adr% !
'Adresse des FREE IMAGE (Mausmaske)
LOCAL bild_pointer% !Zeiger auf Image-Daten f
r Cursorform
LOCAL mask_pointer% !Zeiger auf Image-Daten f
r Maskenform
user_def$=MKI$(xcoord&)+MKI$(ycoord&)+MKI$(1)+MKI$(0)+MKI$(1)
' XKoordinate YKoordinate Farbnr. Mskfarb CurFarb
~RSRC_GADDR(r_frimg&,bild&,bild_adr%)
~RSRC_GADDR(r_frimg&,mask&,mask_adr%)
bild_pointer%={{bild_adr%}}
mask_pointer%={{mask_adr%}}
FOR i|=0 TO 15
user_def$=user_def$+MKI$(CARD{mask_pointer%+SHL|(i|,1)})
NEXT i|
FOR i|=0 TO 15
user_def$=user_def$+MKI$(CARD{bild_pointer%+SHL|(i|,1)})
NEXT i|
CHAR{adr%}=user_def$ !String an INLINE-
'Adresse legen
RETURN
PROCEDURE mouse_show
' Im Original-GFABASIC-Version nur Dummy, da es selbst die
' Maus aus und einschaltet, im GFAPASIC ist es wichtig!
~GRAF_MOUSE(m_on&,0)
RETURN
PROCEDURE mouse_hide
' Im Original-GFABASIC-Version nur Dummy, da es selbst die
' Maus aus und einschaltet, im GFAPASIC ist es wichtig!
~GRAF_MOUSE(m_off&,0)
RETURN
FUNCTION mouse_mem(maus%,type&)
$F%
' INTENT: zeigt laufende Uhr oder Flipscheibe
' RETURN: aktueller Z
hlwert
' EXTERN maus% !Counter
' EXTERN type& !0=Uhr, 1=Flipscheibe, 2=Kreuzcursor
INC maus%
SELECT type&
CASE 0
SELECT maus%
CASE 1000
@
%mouse(user_def&,uhr8%)
RETURN 0
CASE 875
@
%mouse(user_def&,uhr7%)
CASE 750
@
%mouse(user_def&,uhr6%)
CASE 625
@
%mouse(user_def&,uhr5%)
CASE 500
@
%mouse(user_def&,uhr4%)
CASE 375
@
%mouse(user_def&,uhr3%)
CASE 250
@
%mouse(user_def&,uhr2%)
CASE 125
@
%mouse(user_def&,uhr1%)
ENDSELECT
CASE 1
SELECT maus%
CASE 500
@
%mouse(user_def&,mem4%)
RETURN 0
CASE 375
@
%mouse(user_def&,mem3%)
CASE 250
@
%mouse(user_def&,mem2%)
CASE 125
@
%mouse(user_def&,mem1%)
ENDSELECT
CASE 2
SELECT maus%
CASE 20
@
%mouse(thick_cross&,0)
RETURN 0
CASE 10
@
%mouse(outln_cross&,0)
ENDSELECT
ENDSELECT
RETURN maus%
ENDFUNC
PROCEDURE mouse_clear
&mousek(0)
RETURN
lDefmouse GFA-Util
Autor:
@ AC3
> PROCEDURE defmouse(ms|)
bergebener Wert darf zwischen 0 und 7 sein:
' Entspricht DEFMOUSE ms|
' 0 = Pfeil
' 1 = X-Klammer (Text-Cursor)
' 2 = Biene
' 3 = Zeigende Hand
' 4 = Offene Hand
' 5 = Fadenkreuz fein
' 6 = " grob
' 7 = " umrandet
IF ms|>-1 AND ms|<8
~GRAF_MOUSE(ms|,0)
ELSE
~GRAF_MOUSE(0,0)
ENDIF
RETURN
lBusymouse GFA-Util
Autor:
,Ulli Gruszka @ DO,
@ AC3 (weitere Animationen
eingef
tigt wird:
3.33.1
3.33.2
lEinbindung und Aufruf in eigenen Programmen GFA-Util
Wer's einfach haben will, schlachtet BUSY.RSC hemmungslos aus, indem
er die IBOXen mit den Icons an eine beliebige Stelle seiner Resource
kopiert.
Der eigentliche Aufruf findet durch busy(Tree,Obj) statt. Schleifen
bieten sich f
r einen Aufruf an, wobei bedacht werden sollte, da
auch GFA-Basic recht schnell sein kann. :-) Also: Nicht jede Schleife
eignet sich, es sollte schon einiges darin passieren. Anderenfalls
uft die Maus Amok!
Nach dem Ende einer Animation mu
der Mauszeiger nat
rlich noch mit
@defmouse(0) zur
ckgesetzt werden...
lEigene Animationen erstellen GFA-Util
Sollten meine Sch
pfungen nicht gefallen (unwahrscheinlich ;-), mu
r jeden Einzelschritt einer Sequenz ein 16X16 Pixel gro
es Icon
erstellt werden. Alle Icons einer Sequenz m
ssen sich innerhalb eines
Elternobjektes befinden und entsprechend der gew
nschten Bildfolge
sortiert sein.
Bei jedem ersten Icon einer Sequenz muss das Flag SELECTED gesetzt
werden, anhand dessen @busy das derzeit aktuelle Icon erkennt. Der
Selected-State wird demnach von @busy() "umgesetzt".
Den Elternobjekten sollten im RCS Namen zugewiesen werden, damit
diese sp
ter der Busy-Routine
bergeben werden k
nnen.
Die Anzahl der Einzelschritte ist nicht begrenzt, sinnvollerweise ist
sie jedoch >=1. Befindet sich nur ein Icon im Elternobjekt, wird der
Mauszeiger halt nur ver
ndert.
Neben den Icons d
rfen sich
lkeine
d weiteren
in den
Elternobjekten befinden!
Siehe auch:
-Demo
lBusymouse Demo GFA-Util
@do_it
> PROCEDURE do_it ! Alles nur Demo ...
IF RSRC_LOAD("busy.rsc")=0
~FORM_ALERT(1,"[3][Keine Resource-Datei!][Abbruch]")
END
ENDIF
@rsc_zuweisungen ! RSC-Zuweisungen f
r Busymouse Demo
~RSRC_GADDR(0,form1&,form1%)
~RSRC_GADDR(0,form2&,form2%)
~FORM_CENTER(form2%,d&,d&,d&,d&)
~OBJC_DRAW(form2%,0,8,0,0,0,0)
x#=0.1 ! Nur ein Z
hler f
r das Tempo der
' Animation
ani&=ball& ! Die IBOX mit der ersten Sequenz
WHILE mks&<3 ! Schleife bis zum Programmende
'
@busy(form1%,ani&) ! *Das ist der Aufruf.* form1% ist
' ! die
'Adresse des Formulars/Dialogs in dem
' ! die Animationen abgelegt sind, und ani&
' ! ist der
%Index des Objekts (die IBOX ...)
' ! in dem die jeweiligen Icons liegen.
'
~GRAF_MKSTATE(d&,d&,mks&,state&) ! Maus/Tasten-Status abfragen
'
LET sanduhr&=78
IF ani&=ball& AND state&<>0 ! Sequenz wechseln
ani&=disk&
ELSE IF ani&=disk& AND state&<>0
ani&=pulse&
ELSE IF ani&=pulse& AND state&<>0
ani&=arrow&
ELSE IF ani&=arrow& AND state&<>0
ani&=ball2&
ELSE IF ani&=ball2& AND state&<>0
ani&=clock&
ELSE IF ani&=clock& AND state&<>0
ani&=tasse&
ELSE IF ani&=tasse& AND state&<>0
ani&=wuerfel&
ELSE IF ani&=wuerfel& AND state&<>0
ani&=rechner&
ELSE IF ani&=rechner& AND state&<>0
ani&=papier&
ELSE IF ani&=papier& AND state&<>0
ani&=sanduhr&
ELSE IF ani&=sanduhr& AND state&<>0
ani&=ball&
ENDIF
IF mks&=1 AND x#<0.5 ! Tempo ver
ndern
ADD x#,0.01
ELSE IF mks&=2 AND x#>0.01
SUB x#,0.02
ENDIF
DELAY x# ! Warten ...
WEND
@defmouse(0)
~RSRC_FREE()
END
RETURN
> PROCEDURE rsc_zuweisungen ! RSC-Zuweisungen f
r Busymouse Demo
' --WEG
' ++SYM
LET form1&=0
LET ball&=2
LET disk&=7
LET pulse&=10
LET arrow&=23
LET ball2&=25
LET clock&=35
LET tasse&=48
LET wuerfel&=51
LET rechner&=58
LET papier&=63
LET sanduhr&=78
' --------------------------
LET form2&=1
' ++SYM
' --WEG
RETURN
> PROCEDURE busy(tree%,obj&) ! Der Animateur ...
LOCAL first&,last&,i%,adr%,hd$
first&=OB_HEAD(tree%,obj&) ! erstes Icon
last&=OB_TAIL(tree%,obj&) ! letztes Icon
i%=first&
' Hier werden die Mausdaten zusammengesetzt und in ein INLINE gesteckt.
INLINE adr%,74
hd$=MKI$(1)+MKI$(1)+MKI$(1)+MKI$(0)+MKI$(1) ! Header anlegen und ab
BMOVE V:hd$,adr%,10 ! in die Struktur damit
WHILE i%<=last&
IF BTST(OB_STATE(tree%,i%),0) ! Wenn SELECTED, dann
BMOVE LONG{OB_SPEC(tree%,i%)},adr%+10,32 ! Icondaten kopieren,
BMOVE LONG{OB_SPEC(tree%,i%)+4},adr%+42,32 ! Iconmaske kopieren
OB_STATE(tree%,i%)=BCLR(OB_STATE(tree%,i%),0) ! und Icon deSELECTED.
'
INC i% ! N
chstes Icon:
IF i%<=last& ! Wenn noch nicht am
' ! am Ende angekommen,
OB_STATE(tree%,i%)=BSET(OB_STATE(tree%,i%),0) ! dann SELECTED,
ELSE ! sonst das erste Icon
' auf SELECTED setzen.
OB_STATE(tree%,first&)=BSET(OB_STATE(tree%,first&),0)
ENDIF
i%=last& ! = Schleifenende
'
ENDIF ! Anderenfalls weiter-
INC i% ! suchen ...
'
WEND
IF multi_aes! ! Mauszeiger setzen
~GRAF_MOUSE(&H8000 OR 255,adr%) ! Multitasking
ELSE
~GRAF_MOUSE(255,adr%) ! Plain-TOS
ENDIF
RETURN
lEinfache
GFA-Util
Autor:
@ AC3
Diese "Animation" ist auch in
vorhanden.
' MODUL-BUSYMOUSE 1.0
' (C) 05.08.1993 von
' FUNKTION: BUSYMOUSE als rotierender Ball darstellen
INLINE
,592
m_adr%=busymaus%
> PROCEDURE busymouse
' ADD(m_busy%,xxx) xxx= INLINE-L
nge minus 74!
' INLINE-L
nge / 74 = Anzahl der einzel-Bilder
IF m_adr%=ADD(busymaus%,1628)
m_adr%=busymaus%
ELSE
ADD m_adr%,74
ENDIF
~GRAF_MOUSE(255,m_adr%)
RETURN
lEinfache Sanduhr GFA-Util
Autor:
@ AC3
Diese "Animation" ist auch in
vorhanden.
' MODUL-SANDUHR 1.0
' (C) 19.07.1993 von
' FUNKTION: SANDUHR darstellen
INLINE
,1702
m_adr%=
> PROCEDURE sanduhr
' ADD(m_busy%,xxx) xxx= INLINE-L
nge minus 74!
' INLINE-L
nge / 74 = Anzahl der einzel-Bilder
IF m_adr%=ADD(
,1628)
m_adr%=
ELSE
ADD m_adr%,74
ENDIF
~GRAF_MOUSE(255,m_adr%)
RETURN
lMausposition ermitteln GFA-Util
Autor: Peter Harder @ NF
PROCEDURE mouse(VAR mx&,my&,mk&)
LOCAL void&
~WIND_UPDATE(3)
~GRAF_MKSTATE(mx&,my&,mk&,void&)
~WIND_UPDATE(2)
SUB mx&,WORD{WINDTAB+64}
SUB my&,WORD{WINDTAB+66}
RETURN
lMaustastenstatus ermitteln GFA-Util
Autor: Peter Harder @ NF
FUNCTION mousek
$F%
LOCAL mk&,void&
~WIND_UPDATE(3)
~GRAF_MKSTATE(void&,void&,mk&,void&)
~WIND_UPDATE(2)
RETURN mk&
ENDFUNC
lX-Position ermitteln GFA-Util
Autor: Peter Harder @ NF
FUNCTION mousex
$F%
LOCAL mx&,void&
~WIND_UPDATE(3)
~GRAF_MKSTATE(mx&,void&,void&,void&)
~WIND_UPDATE(2)
SUB mx&,WORD{WINDTAB+64}
RETURN mx&
ENDFUNC
lY-Position ermitteln GFA-Util
Autor: Peter Harder @ NF
FUNCTION mousey
$F%
LOCAL my&,void&
~WIND_UPDATE(3)
~GRAF_MKSTATE(void&,my&,void&,void&)
~WIND_UPDATE(2)
SUB my&,WORD{WINDTAB+66}
RETURN my&
ENDFUNC
lMauszeiger verstecken GFA-Util
Autor: Peter Harder @ NF
PROCEDURE hidem
IF maus_aus&=0
~GRAF_MOUSE(256,0)
~WIND_UPDATE(1)
ENDIF
INC maus_aus&
RETURN
lMauszeiger aufdecken GFA-Util
Autor: Peter Harder @ NF
PROCEDURE showm
IF maus_aus&=1
~WIND_UPDATE(0)
~GRAF_MOUSE(257,0)
ENDIF
DEC maus_aus&
IF maus_aus&<0
maus_aus&=0
ENDIF
RETURN
lSETMOUSE-Ersatz GFA-Util
Autor: Peter Harder @ NF
PROCEDURE setmouse(x&,y&) ! GEMSYS 14
' Gepostet in der FAQ 9/94 (
0Gregor Duchalski)
LOCAL a%,a$
a%=OR(y&,SHL(x&,16)) !X/Y-Pos. des Mauszeigers
a$=MKL$(2)+MKL$(a%) !Ereignis
GINTIN(0)=1 !Anzahl Ereignisse
GINTIN(1)=100 !Geschwindigkeit in %
ADDRIN(0)=V:a$ !
'Adresse der Ereignisse
GEMSYS 14 !APPL_TPLAY()
RETURN
lMOUSE-Offset GFA-Util
Autor: Peter Harder @ NF
PROCEDURE mouse_offset(VAR x&,y&) SUB x&,WORD{WINDTAB+64} SUB
y&,WORD{WINDTAB+66} RETURN
s GFA-Util
Hier steht noch nix!
lObjekte GFA-Util
Hier steht noch nix!
lResourceorganisation GFA-Util
lMenushortcut ermitteln GFA-Util
Autor:
,Ulli Gruszka @ DO
Mal ehrlich: Wer hat noch nicht geflucht, weil er einen Men
-Tastatur-
Shortcut im RCS ge
ndert hat und seinen Code anschlie
end einen
halben Meter tief umgraben mu
te? Hm? Wenn der Men
eintrag dann auch
noch einem anderen Titel untergeschoben wurde ...
Diese Funktion erledigt nun die Zuordnung von Tastendr
cken zu
Eintr
gen in Men
umen. Sie kommt aus der Abteilung "Routinen, auf
die die Welt gewartet hat", Unterabteilung "Einbauen und Vergessen!",
denn genau wie bei MN_SELECTED des
, werden die Objektnummern des
Titels und des Eintrages zur
ckgeliefert. Ihre Benutzung garantiert
zu jeder Zeit, also auch zur sp
teren Laufzeit beim Anwender, die
llig freie Konfiguration der Shortcuts.
Unterst
tzt werden alle Tasten in Kombinationen mit CONTROL, SHIFT,
ALTERNATE, sowie die Funktionstasten F1 - F10. Voraussetzung f
einen reibungslosen Ablauf ist allerdings, da
die nicht offiziell
dokumentierte Men
struktur beibehalten wird, da
es sich bei den
eintr
gen um normale G_STRING-
handelt, und da
die SCs im
RCS standardkonform eingetragen werden.
Siehe FUNCTION
lscan_menu() GFA-Util
FUNCTION scan_menu(k_state&,key&,menu%,VAR titel&)
' -------------------------------------------------------------------------
' Shortcutauswertung Copyright (c) 1995 by
,Ulli Gruszka
' -------------------------------------------------------------------------
' Aufruf:
' ... sollte unmittelbar nachdem EVNT_MULTI() ein Tastaturereignis
' gemeldet hat erfolgen. Dabei werden k_state& und key& aus EVNT_MULTI(),
' sowie die
'Adresse des zu durchsuchenden Men
baumes (menu%)
bergeben.
ckgabe:
' Falls ein Men
eintrag gefunden wurde, dessen Shortcut der gedr
ckten
' Tastenkombination entspricht, werden die Objektnummern des Eintrages und
' des zugeh
rigen Titels zur
ckgeliefert, anderenfalls FALSE.
' -------------------------------------------------------------------------
LOCAL sc$,asc&,obj&,box&,ibox&
key&=SHR&(key&,8) ! SCAN-Code der Taste
IF key&>=120 AND key&<=129
SUB key&,118 ! f
r Zifferntasten 1-0
asc&=PEEK({
%XBIOS(16,L:-1,L:-1,L:-1)}+key&) ! ASCII-Code
ELSE
asc&=PEEK({
%XBIOS(16,L:-1,L:-1,L:-1)+4}+key&) ! ASCII-Code (geSHIFTet!)
ENDIF
' ----------------------Men
-Shortcut nachbilden--------------------------
SELECT k_state&
'
CASE 0 ! Funktionstasten
SELECT key& ! Umst
ndlich, aber wer
CASE 59 TO 68 ! hat 'ne bessere Idee?
IF key&=68
sc$="F1" ! Das wird zu F10,
SUB key&,10 ! das sp
ter zur Null
ELSE
sc$="F" ! und das zu F1 - F9
ENDIF
asc&=ASC(STR$(key&-58)) ! wird unten wieder gewandelt
ENDSELECT
CASE 1,2,3 ! SHIFT links, rechts,
sc$=CHR$(1) ! links&rechts
CASE 4 ! CONTROL
sc$="^"
CASE 5,6,7 ! CONTROL & SHIFT l, r,
sc$=CHR$(1)+"^" ! l&r
CASE 8 ! ALTERNATE
sc$=CHR$(7)
CASE 9,10,11 ! ALT & SHIFT l, r,
sc$=CHR$(1)+CHR$(7) ! l&r
CASE 12 ! ALT & CONTROL
sc$=CHR$(7)+"^"
CASE 13 ! ALT & CONTROL & SHIFT(r)
sc$=CHR$(7)+"^"+CHR$(1)
ENDSELECT
' Anmerkung: ALT & CONTROL & DELETE konnte ich
' leider nicht einbauen, da es bei
' mir w
hrend der Entwicklung wieder-
' holt zu unerkl
rlichen Abst
' kam ... (;-)
IF sc$>"" ! Diese Abfrage l
schen, falls SCs
' ohne Umschalttasten vorkommen.
'
sc$=" "+sc$+CHR$(asc&)+" " ! Suchstring komplettieren
'
' ----------------------Men
-Shortcut suchen-----------------------------
'
obj&=OB_NEXT(menu%,OB_TAIL(menu%,2)) ! Damit geht's los ...
WHILE BTST(OB_FLAGS(menu%,obj&),5)=FALSE ! Bis zum letzten Objekt
'
INC obj&
IF OB_TYPE(menu%,obj&)=28 ! Nur String-
IF BTST(OB_STATE(menu%,obj&),3)=FALSE ! die nicht disabled sind!
IF RINSTR(CHAR{OB_SPEC(menu%,obj&)},sc$) ! Falls Shortcut vorhanden,
' ist obj& der Eintrag.
' Weiter mit:
' ------------Titel suchen----------------------------------
titel&=2 ! Offset (1. Titel hat immer
' den
%Index 3.)
box&=obj& ! Zur Suche der Parent-BOX.
DO
box&=OB_NEXT(menu%,box&) ! Bis die Parent-BOX des
LOOP WHILE box&>obj& ! Eintrages auftaucht ...
'
ibox&=OB_NEXT(menu%,1) ! IBOX mit allen
WHILE ibox&<box& ! Wieder bis zur BOX mit
INC ibox& ! dem Eintrag hochz
hlen,
IF OB_TYPE(menu%,ibox&)=20 ! und falls Objekt eine BOX
INC titel& ! ist, dem Titel n
hern ...
ENDIF
WEND
' ------------Funktionsende---------------------------------
RETURN obj& ! Ergebnis abliefern
' ---------------------------------------------------------------
'
ENDIF ! RINSTR
ENDIF ! OB_STATE
ENDIF ! OB_TYPE
'
WEND ! War nix, weiter bis
' zum Ende ...
ENDIF ! sc$
RETURN FALSE ! Shortcut nicht vorhanden
ENDFUNC
lSetzen der OB_STATES und OB_FLAGS GFA-Util
Autor:
@ AC3
' MODULE Gem-Help
' Version 1.2
' (C) 22.10.1993 von
INLINE
,108
GOSUB init_states
' --!PP
> PROCEDURE init_states
' Objekt-Flags
' ++!sy
LET selectable&=0
LET default&=1
LET exit&=2
LET editable&=3
LET rbutton&=4
LET lastob&=5
LET touchexit&=6
LET hidetree&=7
LET indirect&=8
'
' Objekt-States
'
LET selected&=0
LET crossed&=1
LET checked&=2
LET disabled&=3
LET outlined&=4
LET shadowed&=5
' ++!sy
RETURN
' --!PP
> PROCEDURE deffn_s
' Objekt-Flag abfragen
DEFFN get_flag(tr%,obj&,f&)=BTST(OB_FLAGS(tr%,obj&),f&)
' Objekt-State abfragen
DEFFN get_state(tr%,obj&,f&)=BTST(OB_STATE(tr%,obj&),f&)
' Objekt-Text abfragen
DEFFN get_text$(tr%,obj&)=CHAR{C:
(L:tr%,obj&)}
RETURN
> PROCEDURE set_text(tr%,obj&,text$,r!)
'
' Universelle Object-Text-Belegung
'
~WIND_UPDATE(1)
CHAR{C:
(L:tr%,obj&)}=text$
IF r!=TRUE
@redraw(tr%,obj&)
ENDIF
~WIND_UPDATE(0)
RETURN
> PROCEDURE deselect(tr%,obj&,r!)
'
' Objekt Deselektieren
'
' tr% = Dialog-Baum
'Adresse
' obj&=
%Index des Objektes
' r! = Objekt neuzeichnen (TRUE = Ja, FALSE = Nein)
'
@clr_state(tr%,obj&,selected&,r!)
RETURN
> PROCEDURE select(tr%,obj&,r!)
'
' Objekt Selektieren
'
' tr% = Dialog-Baum
'Adresse
' obj&=
%Index des Objektes
' r! = Objekt neuzeichnen (TRUE = Ja, FALSE = Nein)
'
@set_state(tr%,obj&,selected&,r!)
RETURN
> PROCEDURE disable(tr%,obj&,r!)
'
' Objekt Hellgedruckt (disabled) darstellen
'
' tr% = Dialog-Baum
'Adresse
' obj&=
%Index des Objektes
' r! = Objekt neuzeichnen (TRUE = Ja, FALSE = Nein)
'
@set_state(tr%,obj&,disabled&,r!)
RETURN
> PROCEDURE able(tr%,obj&,r!)
'
' Objekt Normal darstellen
'
' tr% = Dialog-Baum
'Adresse
' obj&=
%Index des Objektes
' r! = Objekt neuzeichnen (TRUE = Ja, FALSE = Nein)
'
@clr_state(tr%,obj&,disabled&,r!)
RETURN
> PROCEDURE set_flag(tr%,obj&,f&,r!)
'
' Objekt-Flag setzen
'
' tr% = Dialog-Baum
'Adresse
' obj&=
%Index des Objektes
' f& = Flag, das gesetzt werden soll
' r! = Objekt neuzeichnen (TRUE = Ja, FALSE = Nein)
'
OB_FLAGS(tr%,obj&)=BSET(OB_FLAGS(tr%,obj&),f&)
'
IF r!=TRUE
@redraw(tr%,obj&)
ENDIF
RETURN
> PROCEDURE clr_flag(tr%,obj&,f&,r!)
'
' Objekt-Flag l
schen
'
' tr% = Dialog-Baum
'Adresse
' obj&=
%Index des Objektes
' f& = Flag, das gel
scht werden soll
' r! = Objekt neuzeichnen (TRUE = Ja, FALSE = Nein)
'
OB_FLAGS(tr%,obj&)=BCLR(OB_FLAGS(tr%,obj&),f&)
'
IF r!=TRUE
@redraw(tr%,obj&)
ENDIF
RETURN
> PROCEDURE change_flag(tr%,obj&,f&,r!)
'
' Objekt-Flag
ndern (aus EIN wird AUS, aus AUS wird EIN)
'
' tr% = Dialog-Baum
'Adresse
' obj&=
%Index des Objektes
' f& = Flag, das ge
ndert werden soll
' r! = Objekt neuzeichnen (TRUE = Ja, FALSE = Nein)
'
OB_FLAGS(tr%,obj&)=BCHG(OB_FLAGS(tr%,obj&),f&)
'
IF r!=TRUE
@redraw(tr%,obj&)
ENDIF
RETURN
> PROCEDURE set_state(tr%,obj&,f&,r!)
'
' Objekt-State setzen
'
' tr% = Dialog-Baum
'Adresse
' obj&=
%Index des Objektes
' f& = State, das gesetzt werden soll
' r! = Objekt neuzeichnen (TRUE = Ja, FALSE = Nein)
'
OB_STATE(tr%,obj&)=BSET(OB_STATE(tr%,obj&),f&)
'
IF r!=TRUE
@redraw(tr%,obj&)
ENDIF
RETURN
> PROCEDURE clr_state(tr%,obj&,f&,r!)
'
' Objekt-State l
schen
'
' tr% = Dialog-Baum
'Adresse
' obj&=
%Index des Objektes
' f& = State, das gel
scht werden soll
' r! = Objekt neuzeichnen (TRUE = Ja, FALSE = Nein)
'
OB_STATE(tr%,obj&)=BCLR(OB_STATE(tr%,obj&),f&)
'
IF r!=TRUE
@redraw(tr%,obj&)
ENDIF
RETURN
> PROCEDURE change_state(tr%,obj&,f&,r!)
'
' Objekt-State
ndern (aus EIN wird AUS, aus AUS wird EIN)
'
' tr% = Dialog-Baum
'Adresse
' obj&=
%Index des Objektes
' f& = State, das ge
ndert werden soll
' r! = Objekt neuzeichnen (TRUE = Ja, FALSE = Nein)
'
OB_STATE(tr%,obj&)=BCHG(OB_STATE(tr%,obj&),f&)
'
IF r!=TRUE
@redraw(tr%,obj&)
ENDIF
RETURN
!stg @alias redraw
> PROCEDURE redraw(tr%,obj&)
'
' Objekt Redraw'en (Neuzeichnen)
'
' tr% = Dialog-Baum
'Adresse
' obj&=
%Index des Objektes
'
~OBJC_DRAW(tr%,obj&,3,0,0,0,0)
RETURN
' Ende von MODULE Gem-Help
lrsc_txt_scroll GFA-Util
Autor:
1Oliver Schildmann @ LU
Die Routine habe ich auf einem TT geschrieben, wo sie auch recht
schnell lief. Auf einem 8 MHz ST h
tte es allerdings etwas schneller
sein k
nnen. Die gepostete Routine ist daher etwas
berarbeitet und
findet erst in der n
chsten
%XINFO-Version Verwendung (nur f
r den
Fall, dass sich jemand wundert, dass das Scrolling in
%XINFO so
langsam und hier so schnell ist :-).
' Hauptprogramm: Setzen des Pfades in den Dialog
' Path.pos%=Len(Filename$)-Len(@Ob_text$(Fileinfo_adr%,Path_txt&))+1
' TEXT-Feld darf _nicht_ leer sein (mit '_' auffuellen) -^ (oder direkt die
' Werte des Objektes abfragen, s. DEFFN OB_TEXTLEN)
@Objc_text(Fileinfo_adr%,Path_txt&,Filename$,Path.pos%)
' Jetzt Object-Abfrage mit FORM_DO. Aufbau im Dialog: <- C:\DIR1\F.TXT__ ->
' Die Sortierung im Resourcebaum ist ausschlaggebend f
r 'links' und 'rechts'
' alternativ kann man auch den Inhalt der BOXCHAR-
(<-,->) abfragen.
' Object& mit FORM_DO ermitteln
&Select Object&
Case Path_left&,Path_right&
Path.pos%=@Objc_scroll(Fileinfo_adr%,Object&,Path_txt&,Path.pos%,Filename$)
Endselect
' Unterroutinen
> procedure Objc_text(Adr%,Obj&,Text$,P%) ! Objekt mit neuem Text versehen
' -----------
' TEXT OBJECT
' ----------- 1.2 080294
' Parameter : Adr% (
'Adresse des Objektbaumes, dem das Objekt angeh
' Obj& (Nummer des Objektes)
' Text$ (Text, der in das Objekt geschrieben wird)
' P% (Position des Textes: 0=Normal, >0=Ausschnitt, <0=Auff
llen)
' PreProc : -
' InlineProc: -
' InlineFunc: -
' Konstante : -
' Variable : -
If P%<>0
If P%>0 ! Wenn P%>0, dann Ausschnitt
Text$=Mid$(Text$,P%,Len(@Ob_text$(Adr%,Obj&))) ! berechnen
Else ! sonst mit "_" auff
Text$=Text$+String$(Len(@Ob_text$(Adr%,Obj&))-Len(Text$),"_")
Endif ! da String kleiner als Feld
Endif
Text$=Left$(Text$,@Ob_textlen(Adr%,Obj&))
Char{{Ob_spec(Adr%,Obj&)}}=Text$
Deffn Ob_text$(Adr%,Obj&)=Char{{Ob_spec(Adr%,Obj&)}}
Deffn Ob_textlen(Adr%,Obj&)=Pred(Card{Ob_spec(Adr%,Obj&)+24})
Return
> Function Objc_scroll(Adr%,Obj&,Txt&,Pos%,Text$)
' -----------------------
' SCROLLBARES TEXT OBJECT
' ----------------------- 1.1 280494
' Parameter : Adr% (
'Adresse des Objektbaumes, dem das Objekt angeh
' Obj& (Nummer des Pfeil-Objektes)
' Txt& (Nummer des Text-Objektes)
' Text$ (Text, der in das Objekt geschrieben wird)
' Pos% (Position des Textes)
' PreProc : -
' InlineProc: Objc_select, Objc_draw, Objc_text
' InlineFunc: Mousek
' Konstante : -
' Variable : -
ckgabe : Pos% (neue Position des Textes)
Repeat
If Obj&=Pred(Txt&) ! Obj& links vom Text, also <-
If Pos%>1 ! Position ist gr
sser 1, also
Dec Pos% ! kann der Text zum Anfang
@Objc_text(Adr%,Txt&,Text$,Pos%)
@Objc_draw(Adr%,Txt&,5,0,0,0,0)
Endif
Else ! Obj& rechts vom Text, also ->
If Len(Text$)-Len(@Ob_text$(Adr%,Txt&))-Pos%+1>0 ! Wenn noch Text da,
Inc Pos% ! Text zum Ende scrollen
@Objc_text(Adr%,Txt&,Text$,Pos%)
@Objc_draw(Adr%,Txt&,5,0,0,0,0)
Endif
Endif
~@Evnt_timer(20) !
%Pause f
r schnelle Computer
Until And(@Mousek,1)=False ! Bis linke Taste gel
st wird
Return Pos%
Endfunc
r @OBJC_DRAW() und ~@EVNT_TIMER() sollte man nat
rlich die
#GEM-Aufrufe
' verwenden, ~@MOUSEK ist ebenfalls ein
-Ersatz f
r den GFA-Befehl.
lShell-Kommunikation GFA-Util
Hier steht noch nix!
GFA-Util
Hier steht noch nix!
lZwischenspeicher GFA-Util
lClipboard finden (nach Schildmann) GFA-Util
Autor:
1Oliver Schildmann @ LU
' Pt$ (Zeichen f
r den Pfadtrenner; i.d.R. '\')
' @Search.env(Env$) (durchsucht das Environment nach der Variablen Env$ und
'
bergibt den Wert in der globalen Variablen Env_value$)
&Drvmap (
bergibt alle verf
gbaren Laufwerke als 32-Bit-Vektor)
' @Noq(Drive%) (ermittelt die Laufwerks-Nummer aus einem 32-Bit-Vektor)
' @Exist(File$) (
berpr
ft Existenz einer Datei/eines Ordners/Laufwerks)
' @Medium.protected(File$) (
berpr
ft mittels
, ob das Laufwerk der
' Datei File$ schreibgesch
tzt ist)
' @Killfile(File$,Wipe!,Protected!) (l
scht File$, mit
berschreiben 'Wipe!'
' und mit Schreibschutz 'Protected!')
> function Init.clipbrd$ ! CLIPBRD ermitteln und initialisieren
' ----------------------
' CLIPBRD INITIALISIEREN
' ---------------------- 1.1 130594
' Parameter : -
' PreProc : -
' InlineProc: -
' InlineFunc: Search.env,
&Drvmap, Noq, Exist, Medium.protected, Killfile
' Konstante : Pt$
' Variable : -
ckgabe : Pfad des Clipboards (ohne abschliessenden Trenner)
' Anmerkung : Das Clipboard-Verzeichnis ist immer im Format 'X:\ORDNER'
Local Clipbrd$,Q%
~Scrp_read(Clipbrd$) ! Erst im
nachsehen. Wenn Inhalt
If Clipbrd$="" Or Mid$(Clipbrd$,2,2)<>":"+Pt$ Or Len(Clipbrd$)<4 ! leer oder
Q%=Dpeek(1094) ! merkw
rdig, BOOT-Laufwerk feststellen
Clipbrd$="CLIPBRD" ! Standard-Ordner und ENV-Variable
If @Search.env(Clipbrd$) And Env_value$<>"" And Mid$(Env_value$,2,2)=":"+Pt$ And Len(Env_value$)>3 ! * AN OBERE ZEILE ANH
NGEN *
Clipbrd$=Env_value$ ! Environment nach CLIPBRD absuchen
Else if Q%>1 And Q%<=90 ! Wenn nicht, zuerst das BOOT-Laufwerk
Clipbrd$=Chr$(65+Q%)+":"+Pt$+Clipbrd$ ! (wenn nicht A:, B: oder >Z:)
Else if (@
&Drvmap And 4)>0 ! Existiert wenigstens Laufwerk C:?
Clipbrd$="C:"+Pt$+Clipbrd$
Else if (@
&Drvmap And -4)>0 ! sonst 1. nicht Disk-Laufwerk nehmen
Clipbrd$=Chr$(64+@Noq(@
&Drvmap And -4))+":"+Pt$+Clipbrd$
Else if Q%<=1 ! Nun doch A: oder B: :-(
Clipbrd$=Chr$(65+Q%)+":"+Pt$+Clipbrd$
Else ! Hmm, da war ein Fehler in boot_dev!
Clipbrd$="A:"+Pt$+Clipbrd$
Endif
Endif
If Right$(Clipbrd$,1)=Pt$ ! ggf. abschliessenden "\" entfernen
Clipbrd$=Left$(Clipbrd$,Pred(Len(Clipbrd$)))
Endif
If Not @Exist(Clipbrd$) ! Wenn Ordner nicht existiert und
If Not @Medium.protected(Clipbrd$) ! wenn Laufwerk nicht gesch
tzt ist,
Mkdir Clipbrd$ ! Ordner anlegen
Endif ! (momentan keine Rekursion!)
Endif
If @Exist(Clipbrd$) ! Wenn Ordner existiert,
~Scrp_write(Clipbrd$) ! CLIPBRD-Pfad dem
bekanntgeben und
Repeat ! alle SCRAP-Dateien l
schen (auch die
Until Not @Killfile(Clipbrd$+Pt$+"SCRAP.*",False,True) ! mit Schreibschutz)
Else ! Ansonsten wird der CLIPBRD-Pfad
Clipbrd$="" ! wieder gel
scht.
Endif
Return Clipbrd$
Endfunc
> function Exist(Filename$) ! Existiert ein Pfad/eine Datei
' --------------------
' EXISTIERT PFAD/DATEI
' -------------------- 2.0 270494
' Parameter : Filename$ (Dateiname mit Pfad und Extension, oder Pfad mit '\')
' PreProc : -
' InlineProc: -
' InlineFunc:
&Drvmap
' Konstante : Pt$
' Variable : -
If Len(Filename$)=3 And Right$(Filename$,2)=":"+Pt$ ! Filename ist ROOT?
Return (@
&Drvmap And (2^(Asc(Upper$(Left$(Filename$,1)))-65)))>0
Else ! Ist Drive vorhanden?
Return (
'Fsfirst(Filename$+Chr$(0),63)=0) ! Erweitert und f
Endif
Endfunc
Deffn
&Drvmap=Gemdos(14,Gemdos(25))
' Ermittele Potenz ( Q%=@Noq(2^Q%)-1 im Bereich von 0-30)
Deffn Noq(Q%)=Mul(Sub(Rinstr(Bin$(Q%,32),"1"),33),(Q%<>0))
lClipboard finden (nach R
ger) GFA-Util
Autor: Frank R
ger @ OS2
FUNCTION find_clipbrd(set!,VAR clipbrd$)
$F%
LOCAL abbruch!
LOCAL fehler|
LOCAL drivemap&
LOCAL fehler&
LOCAL i&
LOCAL d$
LOCAL clipbrd%
LOCAL drive$
LOCAL neuord$
CLR clipbrd$
~SCRP_READ(clipbrd$)
FOR i&=0 TO 1
IF LEN(clipbrd$)=0
IF i&
~SHEL_ENVRN(clipbrd%,"SCRAPDIR")
ELSE
~SHEL_ENVRN(clipbrd%,"CLIPBRD")
ENDIF
IF clipbrd%
clipbrd$=CHAR{clipbrd%}
clipbrd$=TRIM$(clipbrd$)
IF LEFT$(clipbrd$)="="
clipbrd$=TRIM$(MID$(clipbrd$,2))
ENDIF
ENDIF
ENDIF
NEXT i&
IF LEN(clipbrd$)=0
drivemap&=
(dsetdrv&,
&GEMDOS(dgetdrv&)) AND &HFFFF
FOR i&=0 TO 1
drive$=CHR$(ASC("A")-2*(i&=0)) !C bzw. A
'
2' #UMBRUCH ANFANG!
IF (i&=0 AND BTST(drivemap&,2)) OR (i&=1
AND LEN(clipbrd$)=0 AND NOT abbruch!)
0' #UMBRUCH ENDE!
'
IF FSFIRST(drive$+":\CLIPBRD",fa_direc&)=0
~SCRP_WRITE(drive$+":\CLIPBRD\")
clipbrd$=drive$+":\CLIPBRD\"
ELSE IF set!
neuord$=drive$+":\CLIPBRD"+null$
REPEAT
fehler&=
(dcreate&,L:V:neuord$)
IF fehler&
'
2' #UMBRUCH ANFANG!
fehler|=@my_alert(stop&,"Fehler bei
'Dcreate()=
(75)!|Returncode:
"+STR$(fehler&)+"|beim Anlegen des
Ordners|"+@pfad_format$(LEFT$(neuord$,
PRED(LEN(neuord$))),40),2,"Abbruch|Nochmal")
0' #UMBRUCH ENDE!
'
abbruch!=fehler|=1
EXIT IF abbruch!
ENDIF
UNTIL fehler&=0
IF NOT abbruch!
~SCRP_WRITE(drive$+":\CLIPBRD\")
clipbrd$=drive$+":\CLIPBRD\"
ENDIF
ENDIF
ENDIF
NEXT i&
ELSE IF RIGHT$(clipbrd$)<>"\"
clipbrd$=clipbrd$+"\"
ENDIF
RETURN LEN(clipbrd$)=0 OR abbruch!
ENDFUNC
schen des Clipboards GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION
*scrp_clear
$F%
LOCAL stat&,file$
' L
scht das Klembrett...
~GRAF_MOUSE(2,0)
file$=@scrp_file$ ! Erste Datei suchen
WHILE file$<>"" ! Solange bis keine mehr da...
file$=clipbrd$+file$ ! Ganzer Pfad
stat&=@f_kill(file$) ! ...l
schen
EXIT IF stat& ! Fehlgeschlagen?
file$=@scrp_file$ ! N
chste Datei suchen
WEND
~GRAF_MOUSE(0,0)
IF stat& ! Wenn Fehler...
stat&=130 ! ...dann dieser Fehler-Code
ENDIF
RETURN stat&
ENDFUNC
lLesen einer Datei vom Clipboard GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION scrp_file$
LOCAL stat&,file$
' Liest eine Datei vom Klemmbrett...
~FSETDTA(ADD(BASEPAGE,128)) !
'Adresse sicherheitshalber setzen
file$=clipbrd$+"SCRAP.*" ! Datei...
stat&=FSFIRST(file$,&X0) ! ...suchen
IF stat&=0 ! Gefunden...
file$=CHAR{ADD(BASEPAGE,158)} ! ...Namen auslesen
RETURN file$
ENDIF
RETURN "" ! Nichts drin
ENDFUNC
lGEMDOS GFA-Util
(F...)
(T...)
(P...)
(M...)
(S...)
(D...)
(C...)
lDateifunktionen GFA-Util
(OPEN "A")
(Dateiattribute
ndern)
(BGET #1,a%,l%)
(BPUT #1,a%,l%)
(BLOAD datei$)
(BSAVE datei$)
(CLOSE(#1))
(OPEN "O")
(EOF(#1))
(LINE INPUT #1,a$)
(
$KILL datei$)
(LOF(#1))
(LOC(#1))
(MKDIR ordner$)
(OUT #1)
(OUT& #1)
(OUT% #1)
(OPEN "I")
(PRINT #1,a$;)
(PRINT #1,a$)
(RENAME alt$ AS neu$)
(RMDIR ordner$)
(SEEK #1,pos%)
(OPEN "U")
Existenz einer Datei testen
Datei-Info ermitteln
Existenz eines Laufwerkes ermitteln
Existenz eines Ordners ermitteln
Extrahiert Dateinamen mit Punkt
Extrahiert Dateinamen ohne Punkt
Extrahiert die Extension
Extrahiert den Pfad mit Punkt
Extrahiert den Pfad ohne Punkt
berpr
fen des Fastload-Flags
Setzen des Fastload-Flags
Schreibschutz testen
Disknamen lesen
Disknamen schreiben
Datei kopieren (nach Duchalski)
Datei kopieren1 (nach Gruszka)
Datei kopieren2 (nach Gruszka)
Lange Pfadnamen k
rzen (nach Dunkel)
Lange Pfadnamen k
rzen (nach R
Lange Pfadnamen k
rzen (nach Klasen)
Extender zwangsweise(!) vorgeben (nach Wedding)
Extender zwangsweise(!) vorgeben (nach Harder)
Filenamen 'formatieren'
Blinken der Laufwerkslampen
Aktuellen Pfad ermitteln
Bei bestehender Datei die Extension
ndern
Gr
te Versionsnummer verschiedener Files ausgeben
Extrahiert den Pfad ohne Datei
Extrahiert die Datei aus einem Pfad
lf_close() GFA-Util
Autor:
0Gregor Duchalski @ DO
' CLOSE #1
DEFFN f_close(fh&)=
(62,fh&)
lf_out() GFA-Util
Autor:
0Gregor Duchalski @ DO
' OUT #1,a|
DEFFN f_out(fh&,a|)=
(64,fh&,L:1,L:V:a|)
lf_outw() GFA-Util
Autor:
0Gregor Duchalski @ DO
' OUT& #1,a&
DEFFN f_outw(fh&,a&)=
(64,fh&,L:2,L:V:a&)
lf_outl() GFA-Util
Autor:
0Gregor Duchalski @ DO
' OUT% #1,a%
DEFFN f_outl(fh&,a%)=
(64,fh&,L:4,L:V:a%)
lf_bput() GFA-Util
Autor:
0Gregor Duchalski @ DO
' BPUT #1,a%,l%
DEFFN f_bput(fh&,a%,l%)=
(64,fh&,L:l%,L:a%)
lf_bget() GFA-Util
Autor:
0Gregor Duchalski @ DO
' BGET #1,a%,l%
DEFFN f_bget(fh&,a%,l%)=
(63,fh&,L:l%,L:a%)
lf_print() GFA-Util
Autor:
0Gregor Duchalski @ DO
' PRINT #1,a$;
DEFFN f_print(fh&,a$)=
(64,fh&,L:LEN(a$),L:V:a$)
lf_seek() GFA-Util
Autor:
0Gregor Duchalski @ DO
' SEEK #1,pos%
DEFFN f_seek(fh&,pos%)=
(66,L:pos%,fh&,0)
lf_loc() GFA-Util
Autor:
0Gregor Duchalski @ DO
' LOC(#1)
DEFFN f_loc(fh&)=
(66,L:0,fh&,1)
lf_rename() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_rename(a$,b$)
$F%
' RENAME a$ AS b$
a$=a$+CHR$(0)
b$=b$+CHR$(0)
RETURN
(86,0,L:V:a$,L:V:b$)
ENDFUNC
lf_kill() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_kill(a$)
$F%
$KILL a$
a$=a$+CHR$(0)
RETURN
(65,L:V:a$)
ENDFUNC
lf_rmdir() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_rmdir(a$)
$F%
' RMDIR a$
a$=a$+CHR$(0)
RETURN
(58,L:V:a$)
ENDFUNC
lf_mkdir() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_mkdir(a$)
$F%
' MKDIR a$
a$=a$+CHR$(0)
RETURN
(57,L:V:a$)
ENDFUNC
lf_create() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_create(a$)
$F%
' OPEN "O"
a$=a$+CHR$(0)
RETURN
(60,L:V:a$,0)
ENDFUNC
lf_open() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_open(a$)
$F%
' OPEN "I"
a$=a$+CHR$(0)
RETURN
(61,L:V:a$,0)
ENDFUNC
lf_update() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_update(a$)
$F%
' OPEN "U"
a$=a$+CHR$(0)
RETURN
(61,L:V:a$,2)
ENDFUNC
lf_append() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_append(a$)
$F%
LOCAL fh&,a%
' OPEN "A"
a$=a$+CHR$(0)
fh&=
(61,L:V:a$,2) ! OPEN "U"
IF fh&=-33 ! Existiert nicht...
fh&=
(60,L:V:a$,0) ! OPEN "O"
ENDIF
IF fh&>0
a%=
(66,L:0,fh&,2) ! SEEK #1,lof%
IF a%<0
RETURN a% ! Error beim Seeken
ENDIF
ENDIF
RETURN fh&
ENDFUNC
lf_lof() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_lof(fh&)
$F%
LOCAL pos%,lof%
' LOF(#1)
pos%=
(66,L:0,fh&,1) ! LOC(#1)
lof%=
(66,L:0,fh&,2) ! SEEK #1,LOF(#1)
(66,L:pos%,fh&,0) ! SEEK #1,LOC(#1)
RETURN lof%
ENDFUNC
lf_eof() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_eof(fh&)
$F%
LOCAL pos%,lof%
' EOF(#1)
pos%=
(66,L:0,fh&,1) ! LOC(#1)
lof%=
(66,L:0,fh&,2) ! SEEK #1,LOF(#1)
(66,L:pos%,fh&,0) ! SEEK #1,LOC(#1)
RETURN pos%>=lof% ! EOF(#1)
ENDFUNC
lf_println() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_println(fh&,a$)
$F%
' PRINT #1,a$
a$=a$+CHR$(13)+CHR$(10)
RETURN
(64,fh&,L:LEN(a$),L:V:a$)
ENDFUNC
lf_input() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_input$(fh&)
LOCAL a|,e%,a$,b$
' LINE INPUT #1,a$
b$=CHR$(13)+CHR$(10) ! Linefeed
WHILE RIGHT$(a$,2)<>b$
e%=
(63,fh&,L:1,L:V:a|) ! INP #1,a|
EXIT IF e%<>1 ! EOF(#1)
a$=a$+CHR$(a|)
WEND
IF RIGHT$(a$,2)=b$
a$=LEFT$(a$,SUB(LEN(a$),2)) ! LF abh
ENDIF
RETURN a$
ENDFUNC
lf_bload() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_bload(file$,adr%)
$F%
LOCAL fh&,lof%,pos%
' BLOAD file$,adr%
file$=file$+CHR$(0)
~GRAF_MOUSE(2,0)
fh&=
(61,L:V:file$,0) ! f_open
IF fh&>0
pos%=
(66,L:0,fh&,1) ! LOC(#1)
lof%=
(66,L:0,fh&,2) ! f_seek(LOF(#1))
(66,L:pos%,fh&,0) ! f_seek(LOC(#1))
(63,fh&,L:lof%,L:adr%) ! f_read
(62,fh&) ! f_close
ENDIF
~GRAF_MOUSE(0,0)
RETURN lof% ! L
nge der Datei
ENDFUNC
lf_bsave() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION f_bsave(file$,adr%,lof%)
$F%
LOCAL fh&
' BSAVE file$,adr%,lof%
~GRAF_MOUSE(2,0)
fh&=
(60,L:V:file$,0) ! f_create
IF fh&>0
(64,fh&,L:lof%,L:adr%) ! f_write
(62,fh&) ! f_close
ENDIF
~GRAF_MOUSE(0,0)
RETURN fh&
ENDFUNC
lfile$() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION file$(a$)
LOCAL a&
' Extrahiert Dateinamen: "D:\TEST\TEST.GFA" --> "TEST.GFA"
IF a$<>""
a&=RINSTR(a$,"\") ! Backslash suchen
IF a& ! Wenn ja...
a$=MID$(a$,SUCC(a&)) ! Extrahiere Dateinamen...
RETURN TRIM$(a$) ! ...ohne Spaces
ELSE
RETURN a$
ENDIF
ENDIF
RETURN "" ! Sonst kein Filename
ENDFUNC
lfile.$() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION file.$(a$)
LOCAL a&
' Extrahiert Dateinamen ohne '.': "D:\TEST\TEST.GFA" --> "TEST"
a$=@file$(a$)
a&=INSTR(a$,".")
IF a&
RETURN LEFT$(a$,PRED(a&))
ENDIF
RETURN a$
ENDFUNC
lext$() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION ext$(a$)
LOCAL a&
' Extrahiert Dateiextender: "D:\TEST.GFA" --> "GFA"
a&=RINSTR(a$,".") ! Punkt suchen
IF a& ! Wenn vorhanden...
RETURN MID$(a$,SUCC(a&)) ! ...extrahiere Extender
ENDIF
RETURN ""
ENDFUNC
lpfad$() GFA-Util
Autor:
0Gregor Duchalski @ DO
' Extr. Pfadnamen: "D:\TEST.GFA" --> "D:\"
DEFFN pfad$(a$)=LEFT$(a$,RINSTR(a$,"\"))
lpfad.$() GFA-Util
Autor:
0Gregor Duchalski @ DO
' Extr. Pfadnamen: "D:\TEST.GFA" --> "D:\TEST."
DEFFN pfad.$(a$)=LEFT$(a$,RINSTR(a$,"."))
lf_attr() GFA-Util
Autor: Frank R
ger @ OS2
' Die Funktion liefert entweder die neuen Attribute der Datei oder
' einen negativen Fehlercode!
' neuattr&=@fattrbit("XYZ.DAT",TRUE,0) ! RO-Bit setzen
' oder
' neuattr&=@fattrbit("XYZ.DAT",FALSE,0) ! RO-Bit l
schen
FUNCTION fattrbit(fname$,set!,bit&)
LOCAL fehler&
fname$=fname$+CHR$(0)
fehler&=
(67,L:V:fname$,0,0) ! Lesen
IF fehler&>=0
IF set!
fehler&=BSET(fehler&,bit&) ! Setzen
ELSE
fehler&=BCLR(fehler&,bit&) ! L
schen
ENDIF
'
fehler&=
(67,L:V:fname$,1,fehler&) ! Schreiben
ENDIF
RETURN fehler&
ENDFUNC
lexist() GFA-Util
Autor:
@ AC3
> FUNCTION exist(such$)
$F%
~FSETDTA(BASEPAGE+128)
IF FSFIRST(such$+CHR$(0),&X10000)=0
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
lget_fileinfo() GFA-Util
Autor:
0Gregor Duchalski @ DO
' Ermittelt die Datei-Infos...
> FUNCTION get_fileinfo(datei$,VAR datum$,uhr$,laenge%)
LOCAL a|,a&,b&,f&
LOCAL sek|,min|,std|,tag|,mon|,jhr&
f&=FSFIRST(datei$,0) ! Datei suchen...
IF f&=0 ! ...gefunden
a|=BYTE{BASEPAGE+128+21} ! Attribute
a&=WORD{BASEPAGE+128+22} ! Uhrzeit
b&=WORD{BASEPAGE+128+24} ! Datum
laenge%={BASEPAGE+128+26} ! L
sek|=(a& AND &X11111)*2
min|=SHR(a&,5) AND &X111111
std|=SHR(a&,11) AND &X11111
uhr$=@null$(std|,2)+":"+@null$(min|,2)+":"+@null$(sek|,2)
tag|=b& AND &X11111
mon|=SHR(b&,5) AND &X1111
jhr&=(SHR(b&,9) AND &X11111)+1980
datum$=@null$(tag|,2)+"."+@null$(mon|,2)+"."+@null$(jhr&,4)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
lexist_drive() GFA-Util
Autor: Peter Harder @ NF
FUNCTION exist_drive(pfad$)
$F%
' gibt TRUE zur
ck, falls ein bestimmtes Laufwerk exisiert,
' der erste Buchstabe des
bergebenen Stringvariable ist dabei Ma
geblich
' Aufrufbeispiel: IF @exist_drive("C:\WORDPLUS\BRIEF.DOC")=TRUE
LOCAL drive!,drives%,byte&
pfad$=UPPER$(pfad$)
IF MID$(pfad$,2,1)=":" OR LEN(pfad$)=1
byte&=ASC(pfad$)-65
drives%=
(14,
&GEMDOS(25)) ! Laut Profibuch S 223
IF BTST(drives%,byte&)=TRUE
drive!=TRUE
ELSE
drive!=FALSE
ENDIF
ELSE
drive!=TRUE
ENDIF
RETURN drive!
ENDFUNC
lexist_ordner() GFA-Util
Autor: Peter Harder @ NF
FUNCTION exist_ordner(ordner$)
$F%
' gibt TRUE zur
ck, falls ein bestimmter Ordner exisiert
' Aufrufbeispiel: IF @exist_ordner("C:\WORDPLUS")=TRUE
~FSETDTA(BASEPAGE+128) !Setzen der Disktransferadresse
IF FSFIRST(ordner$+CHR$(0),&X10000)=0 !Dateisuche mit gesetztem Ordnerbit,
RETURN TRUE !findet aber auch normale Dateien
ELSE
RETURN FALSE
ENDIF
ENDFUNC
lcheck_fastload() GFA-Util
Autor:
0Gregor Duchalski @ DO
> FUNCTION check_fastload(a$)
berpr
ft das FASTLOAD-Flag im Programmheader (1=an/0=aus)...
a%=0
OPEN "U",#1,a$
SEEK #1,&H16
BGET #1,V:a%,4
CLOSE #1
RETURN -a%
ENDFUNC
lset_fastload() GFA-Util
Autor:
0Gregor Duchalski @ DO
> PROCEDURE set_fastload(a$,a%)
' Setzt das FASTLOAD-Flag im Programmheader (1=an/0=aus)...
a%=ABS(a%)
OPEN "U",#1,a$
SEEK #1,&H16
BPUT #1,V:a%,4
CLOSE #1
RETURN
lprotected() GFA-Util
Autor:
0Gregor Duchalski @ DO
' Testet, ob die Datei Schreibgesch
tz ist...
' -1: ja, -33: nicht gefunden, 0: gefunden und nicht protected
> FUNCTION protected(a$)
LOCAL a&,a|
a&=FSFIRST(a$,0) !Datei suchen...
IF a&=0 !...Gefunden
a|=BYTE{BASEPAGE+128+21}
RETURN BTST(a|,0) !Schreibschutz gesetzt
ENDIF
RETURN a&
ENDFUNC
lgd_copy() GFA-Util
Autor:
0Gregor Duchalski @ DO
' Kopiert eine Datei: copy(source$,dest$)...
> PROCEDURE gd_copy(a$,b$)
LOCAL a%,b%,c%,i%
b%=1
IF EXIST(b$)
ALERT 3," | Datei existiert bereits... ",1,"Weiter|Abbruch",b%
ENDIF
IF b%=1
OPEN "I",#1,a$ !Quell-File
OPEN "O",#2,b$ !Ziel-File
a%=LOF(#1) !L
nge des Files
b%=FRE(0)-3000 !Freier Speicher
c%=a% MOD b% !Rest
DIM a|(b%) !Speicher reservieren
FOR i%=1 TO (a% DIV b%)!Solange alles lesen bis Rest zu klein
BGET #1,V:a|(0),b% !Lesen
BPUT #2,V:a|(0),b% !Schreiben
NEXT i%
BGET #1,V:a|(0),c% !Rest lesen
BPUT #2,V:a|(0),c% !Rest schreiben
CLOSE
ERASE a|()
ENDIF
RETURN
lug_copy1() GFA-Util
Autor:
,Ulli Gruszka @ DO
PROCEDURE ug_copy1(quell_datei$,ziel_datei$)
LOCAL laenge%,frei%,adresse%,puffer%,wieoft%,rest%
OPEN "I",#1,quell_datei$ ! Quelldatei
ffnen, um die L
laenge%=LOF(#1) ! des Files zu ermitteln,
CLOSE #1 ! und wieder schlie
frei%=MALLOC(-1) ! gr
ten freien Speicherblock merken
IF frei%>laenge% ! *Wenn m
glich, alles in einem Rutsch*
adresse%=MALLOC(laenge%) ! Speicher anfordern und die Quelldatei
BLOAD quell_datei$,adresse% ! an die erhaltene
'Adresse laden.
BSAVE ziel_datei$,adresse%,laenge% ! Diesen Bereich jetzt abspeichern,
~MFREE(adresse%) ! und den Speicher wieder freigeben.
ELSE ! *ansonsten st
ckweise kopieren*
puffer%=MALLOC(frei%) ! das holen, was noch frei ist
wieoft%=laenge% DIV frei% ! Anzahl der Schreib/Lesevorg
rest%=laenge% MOD frei% ! eventuellen Rest der Datei merken
OPEN "I",#1,quell_datei$ ! Quelldatei
ffnen
OPEN "O",#2,ziel_datei$ ! Zieldatei anlegen
FOR i%=1 TO wieoft% ! Schleifchen binden
BGET #1,puffer%,frei% ! in den Puffer lesen
BPUT #2,puffer%,frei% ! aus dem Puffer schreiben
NEXT i%
IF rest% ! *jetzt den wahrscheinlichen Dateirest*
BGET #1,puffer%,rest% ! in den Puffer lesen, und
BPUT #2,puffer%,rest% ! aus dem Puffer schreiben
ENDIF
CLOSE #2
CLOSE #1
~MFREE(puffer%)
ENDIF
RETURN
lug_copy2() GFA-Util
Autor:
,Ulli Gruszka @ DO
PROCEDURE ug_copy2(quell_datei$,ziel_datei$)
LOCAL laenge%,adresse%
OPEN "I",#1,quell_datei$ ! Quelldatei
ffnen, um die L
laenge%=LOF(#1) ! des Files zu ermitteln,
CLOSE #1 ! und wieder schlie
adresse%=MALLOC(laenge%) ! Speicher anfordern und die Quelldatei
BLOAD quell_datei$,adresse% ! an die erhaltene
'Adresse laden.
BSAVE ziel_datei$,adresse%,laenge% ! Diesen Bereich jetzt abspeichern,
~MFREE(adresse%) ! und den Speicher wieder freigeben.
RETURN
lget_alabel$() GFA-Util
Autor:
0Gregor Duchalski @ DO
' Disknamen lesen
> FUNCTION get_alabel$(a&)
CHDRIVE a&
~FSETDTA(BASEPAGE+128) ! DTA setzen
a%=FSFIRST("*.*",8) ! nur DISKNAME lesen
a$=CHAR{BASEPAGE+158} ! D_NAME lesen
IF a%=-33 ! wenn kein DISKNAME auf Disk
a$="" ! A$ auf Leerstring setzen
ENDIF
RETURN a$
ENDFUNC
lset_alabel() GFA-Util
Autor:
0Gregor Duchalski @ DO
' Disknamen schreiben...
> PROCEDURE set_alabel(a&,a$)
CHDRIVE a&
a$=LEFT$(a$,8)+CHR$(0) ! dem Namen Nullbyte anh
a%=
(60,L:V:a$,8) ! Datei anlegen
IF a%>0 ! wenn Datei angelegt
(62,a%) ! Datei schlie
(67,L:V:a$,1,8) ! Datei in DISKNAMEN umbennen
ENDIF
RETURN
lmain_path$ GFA-Util
Autor:
0Gregor Duchalski @ DO
' Ermittelt den aktuellen Pfad...
pfad$=CHR$(
(25)+65)+":"+DIR$(0)+"\"
lback_up() GFA-Util
Autor: Peter Harder @ NF
PROCEDURE back_up(pfad$,ext$)
ndert bei einer bestehenden Datei die Extension
' Aufrufbeispiel: ordner$=@ordner_holen$("C:\WORDPLUS\BRIEF.DOC","BAK")
LOCAL b_pfad$
IF EXIST(pfad$) ! Backup
berhaupt erforderlich?
IF RIGHT$(pfad$,4)<>"."+ext$ ! Originalfile mit gleicher Extension?
b_pfad$=pfad$
@set_extension(ext$,b_pfad$) !VAR-1
IF EXIST(b_pfad$) ! Falls vorhanden
$KILL b_pfad$ ! altes Backup l
schen
ENDIF
NAME pfad$ AS b_pfad$ ! und Filename
ndern
ENDIF
ENDIF
RETURN
lget_new_file$() GFA-Util
Autor: Peter Harder @ NF
FUNCTION get_new_file$(ordner$,such$)
' Gibt bei mehreren g
ltigen Dateien die mit
' der gr
ten Versionsnummer zur
' Aufrufbeispiel: pfad$=@get_new_file$("C:\QULLCODE","\ERGO_???.GFA"
' pfad$ enth
lt anschlie
end z.B. "C:\QUELLCODE\ERGO_235.GFA"
LOCAL file$,gr_file$,fehler&
~FSETDTA(BASEPAGE+128) ! Setzen der Disktransferadresse
fehler&=FSFIRST(ordner$+such$,&X100011) ! Dateisuche ohne Ordner
WHILE fehler&=FALSE
file$=CHAR{BASEPAGE+158}
IF file$>gr_file$
SWAP file$,gr_file$
ENDIF
fehler&=FSNEXT()
WEND
RETURN ordner$+"\"+gr_file$
ENDFUNC
lordner_holen$() GFA-Util
Autor: Peter Harder @ NF
FUNCTION ordner_holen$(pfad$)
' Aufrufbeispiel: ordner$=@ordner_holen$("C:\WORDPLUS\BRIEF.DOC")
' ordner$ enth
lt dann "C:\WORDPLUS")
IF INSTR(pfad$,"\")>1
RETURN LEFT$(pfad$,RINSTR(pfad$,"\")-1)
ELSE IF LEN(pfad$)=2 AND RIGHT$(pfad$)=":"
RETURN pfad$
ELSE
RETURN CHR$(
(25)+65)+":"+DIR$(0)
ENDIF
ENDFUNC
ldatei_holen$() GFA-Util
Autor: Peter Harder @ NF
FUNCTION datei_holen$(pfad$)
' Aufrufbeispiel: datei$=@datei_holen$("C:\WORDPLUS\BRIEF.TXT")
' datei$ enth
lt dann "BRIEF.TXT")
IF pfad$<>""
RETURN MID$(pfad$,RINSTR(pfad$,"\")+1)
ELSE
RETURN ""
ENDIF
ENDFUNC
ldrive_blink() GFA-Util
Autor:
0Gregor Duchalski @ DO
' Blinken der Laufwerkslampen...
' a&=Laufwerk 1 oder 2, b&=Wie oft blinken, c&=L
nge des Blinkens
> PROCEDURE drive_blink(a&,b&,c&)
FOR i&=1 TO b&
%XBIOS(29,5-a&)
PAUSE c&
%XBIOS(30,2+a&)
PAUSE c&
NEXT i&
RETURN
lfilename_ext$() GFA-Util
Autor:
@ AC3
' Filename 'formatieren'
' aus TEST.TXT wird TEST .TXT
' aus 12345678.TXT " 12345678.TXT
> FUNCTION filename_ext$(datei$) ! File und Extender extrahieren
anzeige$=datei$ ! Name ermitteln
IF anzeige$<>""
pos|=INSTR(anzeige$,".") ! Punkt im Namen?
IF pos| ! Acht Zeichen vor Punkt?
2' #UMBRUCH ANFANG!
anzeige$=LEFT$(anzeige$,pos|-1)+SPACE$(8-
LEN(LEFT$(anzeige$,pos|-1)))+MID$(anzeige$,pos|)
0' #UMBRUCH ENDE!
ENDIF
anzeige$=anzeige$+SPACE$(12-LEN(anzeige$))
ENDIF
RETURN anzeige$
ENDFUNC
lset_extend$() GFA-Util
Autor:
/Michael Wedding @ AC3
' Extender zwangsweise(!) vorgeben.
' In extend$ wird der Extender (ohne Punkt!!!)
bergeben,
' in select$ der [Pfad- und] Filename.
' Bei dat$=@set_extend$("EXT","FILENAME") oder
' dat$=@set_extend$("EXT","FILENAME.---")
' wird demnach "FILENAME.EXT" zur
ckgegeben.
/Michael Wedding, Apr 11 1993
> FUNCTION set_extend$(extend$,select$)
IF RINSTR(MID$(select$,RINSTR(select$,"\")),".")
select$=LEFT$(select$,PRED(RINSTR(select$,".")))
ENDIF
RETURN select$+"."+extend$
ENDFUNC
lset_extension() GFA-Util
Autor: Peter Harder @ NF
PROCEDURE set_extension(ext$,VAR pfad$)
' Aufrufbeispiel: @set_extension("DOC",brief$)
' Bei der Variablen brief$ wird die Extension "DOC" durch
' anh
ngen oder
berschreiben erzwungen
IF INSTR(@datei_holen$(pfad$),".")=0
pfad$=pfad$+"."+ext$ ! Extension anh
ELSE
pfad$=LEFT$(pfad$,RINSTR(pfad$,"."))+ext$ ! Extension
berschreiben
ENDIF
RETURN
lstr_cut_file$() GFA-Util
Autor:
*Ulf Dunkel @ CLP
Das ist wieder so ein allgemeines Problem. "Wie stelle ich den Pfad
dar?" Was passiert in einem Fenster, wenn der Pfad l
nger ist als die
Titelzeile des Fensters? Es wird nur noch der sichtbare LEFT$() von
gezeigt. V
llig in Ordnung so, niemand quakt deswegen.
Was passiert im Atari-DESKTOP in den Dialogen? Die neueren haben
wirklich wahnsinnig originelle <- und -> Buttons. Damit kannst Du
rlich Dein Pfad-TEXT-Objekt einfach weiterscrollen. Halte ich f
ndlich und unn
, ergo! (und lat
rnich auch meine Programme) schneiden
einfach den redundanten Teil eines Pfadstrings in der Darstellung ab.
Was ist redundant an einem Pfad? Die ersten Ordner, nicht die
letzten.
Den Pfad merkst Du Dir doch
blicherweise in einer Variablen. Ich
hoffe, da
niemand seine Pfadstrings
d in den
#GEM-Objekten
speichert und hofft, da
sie dort immer korrekt liegenbleiben.
Mit einer v
llig banalen Routine kann jeder seine Pfad-Darstellungen
so beschneiden, da
der Anwender immer noch genug von der Pfad-
Information zu sehen bekommt. Z.B. so (Schon wieder rupft er sein
MAIL Service auseinander):
' MODUL STR
' =========
FUNCTION str_cut_file$(file$,long&,path_only!)
' INTENT: gibt einen auf long& verk
rzten Dateinamen zur
ck, wobei die Lauf-
' werksbezeichnung immer intakt bleibt und der rechte Teil des Datei-
' namens vorrangig behandelt wird, z.B. "A:\..\FILENAME.EXT"
' Wer will, kann nat
rlich auch DREI Punkte zeigen. :-/
' RETURN: Originalstring oder gem. INTENT verk
rzter String.
' EXTERN file$ !Wirklicher Dateipfad und -Name
' EXTERN long& !Gew
nschte Anzeige-L
' EXTERN path_only! !TRUE = Nur Pfad, keinen Dateinamen!!
LOCAL here& !Zeiger
LOCAL drive$ !Laufwerk
IF path_only!
IF INSTR(file$,"\")=0 OR LEN(file$)<3
RETURN ""
ENDIF
file$=LEFT$(file$,RINSTR(file$,"\")) !Dateinamen abschneiden
ENDIF
SELECT LEN(file$)
CASE TO 0 !Nix
RETURN ""
CASE 1 TO long& !Max.-L
nge sowieso nicht erreicht?
RETURN file$
ENDSELECT
here&=INSTR(file$,"\")
drive$=LEFT$(file$,here&)+"..\"
file$=MID$(file$,SUCC(here&))
WHILE LEN(file$)+LEN(drive$)>long&
here&=INSTR(file$,"\")
IF here&
file$=MID$(file$,SUCC(here&))
ENDIF
WEND
RETURN drive$+file$
ENDFUNC
lpfad_format$() GFA-Util
Autor: Frank R
ger @ OS2
' 'pfad_format$()' formatiert einen gegebenen Pfad (+Dateiname) auf
' eine vorgegebene L
nge (f&)! Beispiel: Aus
' @pfad_format$("G:\DFUE\CAT\LISTEN\LOCAL\OS-33.LST",30) wird:
' "G:\...T\LISTEN\LOCAL\OS-33.LST"!
' Dabei geht die Funktion davon aus, da
es sich um einen absoluten
' Pfad inkl. Laufwerks-Angabe handelt!
' Die ersten drei Zeichen werden immer ausgegeben!
2' #UMBRUCH ANFANG!
DEFFN pfad_format$(p$,f&)=STRING$(-(LEN(p$)>f&),
LEFT$(p$,3)+"...")+RIGHT$(p$,f&+6*(LEN(p$)>f&))
0' #UMBRUCH ENDE!
lfile_to_rsc$() GFA-Util
Autor:
@ KR
> FUNCTION file_to_rsc$(pfad$,rsc_txt_len|)
REM Diese Funktion verk
rzt einen einkommenden Pfad, wenn er l
REM als das RSC-Text-Objekt ist, in das er eingetragen wird.
REM So wird z.B. aus "H:\BASIX\VESAL\OTHER\INDEXEDI\DUMMY.TXT" bei
REM einer Resourcetextl
nge von z.B. 30 Zeichen
REM "H:\...\INDEXEDI\DUMMY.TXT"
LOCAL a$,b$,p|
IF LEN(pfad$)>rsc_txt_len| ! Pfadl
nge gr
er als RSC-TXT-L
'
a$=LEFT$(pfad$,3)+"..." ! dann die ersten 3 Buchstaben nach a$
b$=RIGHT$(pfad$,LEN(pfad$)-7) ! der Rest nach b$
'
WHILE LEN(a$)+LEN(b$)>rsc_txt_len| !
p|=INSTR(pfad$,"\") ! Pointer auf "\"
b$=RIGHT$(pfad$,LEN(pfad$)-p|+1) ! String ab Pointer nach b$
delete(1,p|+1,pfad$) ! Pfad verk
WEND
'
RETURN a$+b$ ! R
ckgabewert: Verk
rzter String
'
ELSE ! Pfadl
nge kleiner/gleich RSC-TXT-L
'
RETURN pfad$ ! R
ckgabewert: Eingangsstring
'
ENDIF
ENDFUNC
lDatum und Uhrzeit GFA-Util
Hier steht noch nix!
lProzessfunktionen GFA-Util
lPEXEC-Grundlagen GFA-Util
Autor: Roland Skuplik @ DO2
Da die Feinheiten von
%Pexec immer noch nicht allgemein bekannt sind,
fasse ich mal zusammen, was mir dazu einf
%Pexec() f
r GFA-BASIC-Programmierer:
fehler% =
(pexec&, mode&, ...)
IF fehler% = -32
%Pexec-Modus mode& gibt es in dieser
-Version nicht!
... anderen
%Pexec-Modus benutzen ...
ENDIF
IF fehler%
pling
IF fehler% < 0
"Betriebssystem meldet Fehler "+STR$(fehler%)+" beim Programmstart."
ELSE
fehler& = fehler% ! Nur die niederwertigen 16 Bit!
IF NOT magic! AND fehler& = -1 OR fehler& = -69
' Bis TOS 1.02 wird mit 0 beendet. :-(
"Programm mit Bomben abgest
rzt."
ELSE IF NOT magic! AND fehler& = -32 OR fehler& = -68
"Programm mit ^C abgebrochen."
ELSE
"Programm endete mit Fehler "+STR$(fehler&)+"."
ENDIF
ENDIF
ENDIF
lSpeicherverwaltung GFA-Util
lmxalloc() GFA-Util
Autoren:
0Gregor Duchalski @ DO,
1Oliver Schildmann @ LU
FUNCTION mxalloc(size%,art&)
$F%
' Ruft
'Mxalloc() statt
&Malloc() auf, wenn es die
-Version erlaubt...
' m&: 0 = Nur aus dem ST-RAM.
' 1 = Nur aus dem TT-RAM.
' 2 = Egal, aber lieber aus dem ST-RAM.
' 3 = Egal, aber lieber aus dem TT-RAM.
' Bit 5 = GLOBAL \
' Bit 6 = SUPER -MTOS
' Bit 7 = READABLE /
' --------------------------------------------------
ret_value%=
(68,L:size%,art&) ! MXALLOC
IF ret_value%=-32 ! MXALLOC nicht vorhanden (altes TOS)!
IF art&=1 ! Wenn explizit TT-RAM angefordert wurde
ret_value%=0 ! eine 0
bergeben, da kein freies RAM
ELSE ! Ansonsten ganz normal ST-RAM mit
ret_value%=
(72,L:size%) ! (altem) MALLOC-Aufruf allozieren.
ENDIF
ENDIF
RETURN ret_value% ! Und Anfangsadresse oder 0
bergeben
' Ist ein
-Aufruf nicht vorhanden, so wird -32 zur
ckgegeben.
' Ausserdem sollte 0 zur
ckgegeben werden, wenn explizit TT-RAM
' angefordert wurde, aber, wg. ST, keines vorhanden ist.
' Auch und gerade MiNT-Aufrufe sollten mit R
ckgabewert
berpr
' werden!
ENDFUNC
lSystemfunktionen GFA-Util
Hier steht noch nix!
lVerzeichnisfunktionen GFA-Util
(Freien Platz auf Laufwerk/Diskette ermitteln)
ldiskinfo() GFA-Util
Autor:
@ XYZ
' Freien Platz auf Laufwerk/Diskette ermitteln...
free%=@diskinfo("F")
PRINT free%
> FUNCTION diskinfo(drv$)
LOCAL drv&,ret&
drv&=ASC(drv$)-64
INLINE diskinfo%,24
ret&=
(54,L:diskinfo%,drv&)
RETURN {diskinfo%+8}*{diskinfo%+12}*{diskinfo%}
ENDFUNC
lZeichenweise Ein-/Ausgabe GFA-Util
Hier steht noch nix!
lVDI GFA-Util
lAttributfunktionen GFA-Util
Hier steht noch nix!
lAusgabefunktionen GFA-Util
lv_gtext() GFA-Util
Autor:
-David Reitter @ WI2
Also, was ich hier habe, ist ein alternativer v_gtext()-Aufruf, der
einen Textstring mit
'v_gtext ausgibt. Die Daten werden dabei per
Assembler in das INTIN-Feld geschrieben.
' Etwas schnellere
-Text-Ausgabe
' deutlich schneller im Interpreter
PROCEDURE vg_init
DIM vdi%(4)
vdi%(0)=CONTRL
vdi%(1)=INTIN
vdi%(2)=INTOUT
vdi%(3)=PTSIN
vdi%(4)=PTSOUT
' der kompilierte Assemblercode:
INLINE v_gtext_adr%,64
RETURN
' und der Aufruf:
~C:v_gtext_adr%(L:*ausgabestring$,80,100,L:V:vdi%(0))
Hier der Assemblercode:
; V_GTEXT Volker Hemsen Oktober 1991
#GEM-Text f
r GFA-Basic (schnelles TEXT X,Y,A$)
; Der
-Textaufruf wird in GFA-Basic sehr stark abgebremst.
; Mit dieser kleinen Routine ist es m
glich durch
bergabe einer
; String-Deskriptor-
'Adresse einen Text auszugeben.
; Wenn man die X-Koordinate auf ein 8faches legt, erzielt man
; ebenfalls einen enormen Geschwindigkeitszuwachs.
; Noch schneller gehts mit diversen
-Patches, z.B. Quick ST
; Turbo ST,
$NVDI usw.
; Aufruf:
; ~C: adr%( L:*A$ , X& , Y& , L:VDI_BLOCK% )
; (siehe V_GTEXT.LST)
str_des EQU 4 ;*A$
x EQU 8
y EQU 10
vdi_block EQU 12
contrl EQU 0
intin EQU 4
ptsin EQU 8
intout EQU 12
ptsout EQU 16
movea.l vdi_block(SP),A0
move.l A0,D1 ;f
r TRAP
movea.l ptsin(A0),A1 ;ptsin
move.l x(SP),(A1) ;xy setzen
movea.l intin(A0),A2 ;intin
movea.l (A0),A0 ;contrl
move.l #$080002,(A0) ;opcode und anz_ptsin setzen
move.l str_des(SP),D0 ;str_des
tst.l D0
ble.s ende
movea.l D0,A1
move.w 4(A1),D0 ;str_len
tst.w D0
ble.s ende
move.w D0,6(A0) ;anz_intin
movea.l (A1),A1 ;str_adr
loop: clr.b (A2)+ ;Zeichen
bergeben
move.b (A1)+,(A2)+
subq.w #1,D0
bgt.s loop
moveq #$73,D0
trap #2
ende: rts
END
Diese Routine gab's irgendwo mal als Dreingabe. Man kann sie noch schneller
machen, indem man
subq.w #1,D0
bgt.s loop
durch einen
dbra D0,loop
ersetzt, denke ich mir mal (nicht getestet). Vorher mu
dann aber noch ein
subq.w #1,D0
rein.
gale benutze ich eine Ass-Routine, die die TABs automatisch (mit
einem beliebigen Zeichen auf beliebige TAB-Positionen) expandiert und
gleichzeitig die Stringl
nge auf z.B. Fensterbreite begrenzt. Dabei
beginnt sie erst ab einer bestimmten Position im String (f
r den
horziontalen Slider im Fenster), beachtet aber eventuell hiervor
vorkommende TABs. Das ganze ist nat
rlich viel schneller als ein
Durchsuchen des ganzen Strings nach TABs in GFA...
lAuskunftsfunktionen GFA-Util
lvq_chcells() GFA-Util
Autor:
@ XYZ
' Liefert Anzahl der Spalten und Zeilen des Textbildschirms zur
' (LINE-A 'FREI')
'WICHTIG bei 'Aufl
sungsunabh
ngiger' Programmierung!
' WORK_OUT von GFA Arbeitet SEHR Fehlerhaft, da nur die ST-
' Aufl
sungen unterst
tzt werden.
> PROCEDURE
*vq_chcells(VAR spalten%,zeilen%)
CONTRL(1)=0
CONTRL(2)=0
CONTRL(5)=1
CONTRL(6)=V~H
VDISYS 5
spalten%=INTOUT(1)
zeilen%=INTOUT(0)
RETURN
lEingabefunktionen GFA-Util
Hier steht noch nix!
lEscapefunktionen GFA-Util
Hier steht noch nix!
lKontrollfunktionen GFA-Util
Hier steht noch nix!
lRasterfunktionen GFA-Util
lvdi_copy GFA-Util
Autor:
-David Reitter @ WI2
Also gut. Hier mal eine Routine (das ist die Prozedur vdi_copy) zum
Kopieren von Bildschirmbereichen. Aufrufargumente sind die
Koordinaten des linken oberen Punktes des Quellbereiches, die des
rechten unteren Punktes und dann die Zielkorrdinaten (links oben).
Recht flott. Den Rest mu
t Du selbst erledigen, er h
ngt von anderen
Variablen (Fensterbereichskoordinaten, Scrollweite/Buchstabenh
ab. Du mu
t beim normalen Kopieren prinzipiell alles um ein Zeichen
nach oben versetzen (beginne bei der 2. Zeile im Fenster), dann die
unterste Zeile l
schen (einfach PBOX) und die n
chste, neue Zeile
hinzuf
gen. No problem!
chst der Initbereich....
psrcmfdb%=MALLOC(56) ! Vorbereitung f
r vdi_copy()
IF psrcmfdb%<1
ALERT 3,"Fehler bei der Speicher-|reservierung von 56 Bytes !",1,"Abbruch",o%
EDIT
ENDIF
pdesmfdb%=psrcmfdb%+20
(pxyarray%=pdesmfdb%+20
> PROCEDURE vdi_copy(x1,y1,x2,y2,x3,y3)
LOCAL v_width,v_height
v_width=@width(x1,x2)
v_height=@height(y1,y2)
make_zero_mfdb(psrcmfdb%)
make_zero_mfdb(pdesmfdb%)
2' #UMBRUCH ANFANG!
,make_xyarray(
(pxyarray%,x1,y1,x2,y2,x3,y3,
x3+SUB(v_width,1),y3+SUB(v_height,1))
0' #UMBRUCH ENDE!
hide_mouse
)vro_cpyfm(V~H,3,
(pxyarray%,psrcmfdb%,pdesmfdb%)
show_mouse
RETURN
> FUNCTION width(x0,x1)
RETURN ADD(SUB(x1,x0),1)
ENDFUNC
> FUNCTION height(y0,y1)
RETURN ADD(SUB(y1,y0),1)
ENDFUNC
> PROCEDURE hide_mouse
'
(v_hide_c(V~H)
~GRAF_MOUSE(256,0)
RETURN
> PROCEDURE show_mouse
'
(v_show_c(V~H,1)
~GRAF_MOUSE(257,0)
RETURN
> PROCEDURE make_zero_mfdb(pmfdb%)
LONG{pmfdb%}=0
LONG{ADD(pmfdb%,4)}=0
LONG{ADD(pmfdb%,8)}=0
LONG{ADD(pmfdb%,12)}=0
LONG{ADD(pmfdb%,16)}=0
RETURN
> PROCEDURE
,make_xyarray(
(pxyarray%,xq0,yq0,xq1,yq1,xz0,yz0,xz1,yz1)
WORD{
(pxyarray%}=xq0
WORD{ADD(
(pxyarray%,2)}=yq0
WORD{ADD(
(pxyarray%,4)}=xq1
WORD{ADD(
(pxyarray%,6)}=yq1
WORD{ADD(
(pxyarray%,8)}=xz0
WORD{ADD(
(pxyarray%,10)}=yz0
WORD{ADD(
(pxyarray%,12)}=xz1
WORD{ADD(
(pxyarray%,14)}=yz1
RETURN
> PROCEDURE
)vro_cpyfm(handle,wr_mode,
(pxyarray%,psrcmfdb%,pdesmfdb%)
CONTRL(0)=109
CONTRL(1)=4
CONTRL(2)=0
CONTRL(3)=1
CONTRL(4)=0
CONTRL(6)=handle
LONG{ADD(CONTRL,14)}=psrcmfdb%
LONG{ADD(CONTRL,18)}=pdesmfdb%
INTIN(0)=wr_mode
BMOVE
(pxyarray%,PTSIN,16
VDISYS
RETURN
lSauberes (S)GET und (S)PUT GFA-Util
$sget ist wahlweise einmal als Function, einmal als Procedure drin.
Die Variable xbios3! wird bei mir je nach TOS-Version und einiger
abgefragter R
ckgabewerte vorbelegt. Die Vorgehensweise bringt etwas
Geschwindigkeitsgewinn, ist aber wohl nicht in jedermanns Augen ganz
astrein, daher kann man sie auch rausnehmen.
RC_COPY hei
t bei mir @
(scr_copy
einmal am Programmanfang aufgerufen werden
Die Grundroutine von @
(scr_copy stammt von
-David Reitter. Ich habe
Sie noch ein wenig umgestrickt und @
$get$/@
#put hinzugef
gt. Peter
Harder @ NF
lSauberes SGET (als Funktion) GFA-Util
Autor: Peter Harder @ NF
FUNCTION sget$
LOCAL scr$
$sget(scr$)
RETURN scr$
ENDFUNC
lSauberes SGET (als Prozedur) GFA-Util
Autor: Peter Harder @ NF
PROCEDURE sget(VAR scr$)
IF xbios3!=TRUE
@
%hidem
SGET scr$
@
%showm
ELSE
scr$=@
$get$(0,0,639,399)
ENDIF
RETURN
lSauberes SPUT (als Prozedur) GFA-Util
Autor: Peter Harder @ NF
PROCEDURE sput(scr$)
IF xbios3!=TRUE
IF LEN(scr$)=32000
@
%hidem
SPUT scr$
@
%showm
ELSE
ALERT 3,tos$+" Fehler bei SPUT ! ",1," Weiter ",void&
ENDIF
ELSE
@
#put(0,0,scr$)
ENDIF
RETURN
lSauberes GET (als Funktion) GFA-Util
Autor: Peter Harder @ NF
FUNCTION get$(x1&,y1&,x2&,y2&)
LOCAL get$,but&,str_laenge&
LOCAL br&,br_word&,ho&
br&=x2&-x1&+1
ho&=y2&-y1&+1
br_word&=(br&+15)/16
str_laenge&=br_word&*ho&*vdi_planes&*2+4
IF str_laenge&<32768 AND br&>0 AND ho&>0
~FRE(0)
get$=STRING$(str_laenge&,0) ! String vorbelegen
WORD{V:get$}=br& ! Breite eintragen
WORD{V:get$+2}=ho& ! H
'
@
,make_xyarray(pxy_array%,x1&,y1&,x2&,y2&,0,0,SUB(br&,1),SUB(ho&,1))
'
BMOVE loesch_mfdb%,psrc_mfdb%,20 ! Screen-Quellrasterwerte l
schen
LONG{pdes_mfdb%}=V:get$+4 ! Blockadresse String-Zielraster
WORD{pdes_mfdb%+4}=br_word&*16 ! Breite in Pixel
WORD{pdes_mfdb%+6}=ho& ! H
he in Pixel
WORD{pdes_mfdb%+8}=br_word& ! Breite in Word
WORD{pdes_mfdb%+12}=vdi_planes& ! Original, wegen Farbtestversion
'
@
)vro_cpyfm(V~H,3,pxy_array%,psrc_mfdb%,pdes_mfdb%)
'
ELSE
get$="void"
ENDIF
RETURN get$
ENDFUNC
lSauberes PUT (als Prozedur) GFA-Util
Autor: Peter Harder @ NF
PROCEDURE put(x1&,y1&,put$)
LOCAL but&,br&,ho&,br_word&
IF LEN(put$)>4
'
~FRE(0)
br&=WORD{V:put$} ! Breite holen ...
ho&=WORD{V:put$+2} ! ... und die H
br_word&=(br&+15)/16
'
@
,make_xyarray(pxy_array%,0,0,br&-1,ho&-1,x1&,y1&,x1&+br&-1,y1&+ho&-1)
'
BMOVE loesch_mfdb%,pdes_mfdb%,20 ! Screen-Zielrasterwerte l
schen
LONG{psrc_mfdb%}=V:put$+4 ! Blockadresse String-Quellraster
WORD{psrc_mfdb%+4}=br_word&*16 ! Breite in Pixel
WORD{psrc_mfdb%+6}=ho& ! H
he in Pixel
WORD{psrc_mfdb%+8}=br_word& ! Breite in Word
WORD{psrc_mfdb%+12}=vdi_planes& ! Original, wegen Farbtestversion
'
@
)vro_cpyfm(V~H,3,pxy_array%,psrc_mfdb%,pdes_mfdb%)
'
ENDIF
RETURN
lvdi_copy_init GFA-Util
Autor: Peter Harder @ NF
PROCEDURE vdi_copy_init
' Grundroutine von
-David Reitter @ WI2 (Fr, 26.08.94)
INLINE psrc_mfdb%,76
pdes_mfdb%=psrc_mfdb%+20
pxy_array%=pdes_mfdb%+20
loesch_mfdb%=psrc_mfdb%+56
vdi_planes&=LEN(BIN$(WORK_OUT(13)-1))
RETURN
lscr_copy() GFA-Util
Autor: Peter Harder @ NF
PROCEDURE scr_copy(x1&,y1&,w&,h&,x3&,y3&)
x2&=x1&+w&-1
y2&=y1&+h&-1
2' #UMBRUCH ANFANG!
,make_xyarray(pxy_array%,x1&,y1&,x2&,y2&
,x3&,y3&,x3&+SUB(w&,1),y3&+SUB(h&,1))
0' #UMBRUCH ENDE!
BMOVE loesch_mfdb%,psrc_mfdb%,20 ! bei scr_copy beide
BMOVE loesch_mfdb%,pdes_mfdb%,20 ! mfdb loeschen
)vro_cpyfm(V~H,3,pxy_array%,psrc_mfdb%,pdes_mfdb%)
RETURN
lmake_xyarray() GFA-Util
Autor: Peter Harder @ NF
PROC make_xyarray(pxy_array%,xq0&,yq0&,xq1&,yq1&,xz0&,yz0&,xz1&,yz1&)
WORD{pxy_array%}=xq0&
WORD{ADD(pxy_array%,2)}=yq0&
WORD{ADD(pxy_array%,4)}=xq1&
WORD{ADD(pxy_array%,6)}=yq1&
WORD{ADD(pxy_array%,8)}=xz0&
WORD{ADD(pxy_array%,10)}=yz0&
WORD{ADD(pxy_array%,12)}=xz1&
WORD{ADD(pxy_array%,14)}=yz1&
RETURN
lvro_cpyfm() GFA-Util
Autor: Peter Harder @ NF
PROC vro_cpyfm(handle&,wr_mode&,pxy_array%,psrc_mfdb%,pdes_mfdb%)
CONTRL(1)=4
CONTRL(2)=0
CONTRL(3)=1
CONTRL(4)=0
CONTRL(6)=handle&
LONG{ADD(CONTRL,14)}=psrc_mfdb%
LONG{ADD(CONTRL,18)}=pdes_mfdb%
INTIN(0)=wr_mode&
BMOVE pxy_array%,PTSIN,16
%hidem
VDISYS 109
%showm
RETURN
lCookies GFA-Util
6.1
6.2
6.3
6.4
6.5
6.6
lCookie ermitteln (nach Rosin) GFA-Util
Autor:
,Reiner Rosin @ WI2
PROCEDURE test_cookie(kenn$,VAR flag,wert)
REM
REM
REM Modul: test_cookie
REM
REM V1.0 vom 21.11.90
REM
REM Testet, ob der angegebene Cookie im Cookie-Jar installiert ist.
REM R
ckgabe: flag = 0 - nicht installiert
REM oder flag = -1 - installiert, wert = Parameter des Cookie
REM
LOCAL cookie,such_kennung,kennung
such_kennung=CVL(kenn$)
cookie=LPEEK(&H5A0)
IF cookie<>0
REPEAT
kennung=LPEEK(cookie)
wert=LPEEK(cookie+4)
ADD cookie,8
UNTIL kennung=such_kennung OR kennung=0
IF kennung=0
flag=0
wert=0
ELSE
flag=-1
ENDIF
ELSE
flag=0
wert=0
ENDIF
RETURN
lCookie ermitteln (nach R
ger) GFA-Util
Autor: Frank R
ger @ OS2
FUNCTION get_cookie(id$,VAR value%)
$F%
' Sucht den Cookie mit der Kennung id$. Wird er gefunden, wird TRUE
' zur
ckgegeben und in value% der Wert des
LOCAL a%,a$
a%=LPEEK(&H5A0)
IF a%=0
RETURN FALSE
ENDIF
DO WHILE {a%}<>0
a$=MKL$({a%})
ADD a%,8
LOOP UNTIL a$=id$
IF a$=id$
value%={SUB(a%,4)}
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
lCookie ermitteln (nach Dunkel) GFA-Util
Autor
*Ulf Dunkel @ CLP
PROCEDURE sys_cookie_chk
' GLOBAL mint! !TRUE=MiNT-Cookie gefunden, MiNT l
' GLOBAL vscr! !TRUE=VSCR installiert
' GLOBAL vscr_adr% !
'Adresse des VSCR-
' GLOBAL fsel! !TRUE=Fileselect-Box im AUTO-Ordner
mint!=@sys_cookie_jar("MiNT",gl_foo%)
ltmf!=@sys_cookie_jar("LTMF",gl_foo%)
vscr!=@sys_cookie_jar("VSCR",vscr_adr%)
fsel!=@sys_cookie_jar("FSEL",gl_foo%)
RETURN
FUNCTION sys_cookie_jar(cookie$,VAR value%)
$F%
LOCAL cookie_adr%
cookie_adr%=LPEEK(&H5A0) !Pointer zum Cookie-Jar
IF cookie_adr%=0 !Kein cookie-jar gefunden:
RETURN 0 !Raus...
ENDIF
' PRINT MKL$({cookie_adr%})' !Hier steht der Name
IF {cookie_adr%}={V:cookie$} !GOTCHA
value%={ADD(cookie_adr%,4)}
RETURN -1
ENDIF
'
ADD cookie_adr%,8
LOOP UNTIL {cookie_adr%}=0
RETURN 0
ENDFUNC
PROCEDURE vscr_xywh(vscr_adr%,VAR vscr_x&,vscr_y&,vscr_w&,vscr_h&)
' EXTERN vscr_adr% !Adr. des VSCR-
' EXTERN VAR vscr_x& ... !Koordinaten des aktuellen Bildschirmausschnitts
LOCAL x&,y&,w&,h& !Hilfskoordinaten
CLR x&,y&,w&,h& !Wei
nicht mehr, warum hier CLR auf LOCALs, ohne
' !lief's aber bei mir nicht richtig. :-)
' typedef struct !C abschreiben leicht gemacht ... ;-)
' {
' ABSOLUTE vscr_cookie%,vscr_adr%
' ABSOLUTE vscr_product%,vscr_adr%+4
' ABSOLUTE vscr_version&,vscr_adr%+8
ABSOLUTE x&,ADD(vscr_adr%,10)
ABSOLUTE y&,ADD(vscr_adr%,12)
ABSOLUTE w&,ADD(vscr_adr%,14)
ABSOLUTE h&,ADD(vscr_adr%,16)
' } VSCR;
' PRINT "
:"'HEX$(vscr_cookie%),MKL$(vscr_cookie%)
' PRINT "VSCR-Product:"'HEX$(vscr_product%),MKL$(vscr_product%)
' PRINT "VSCR-Version:"'HEX$(vscr_version&)
vscr_x&=x&
vscr_y&=y&
vscr_w&=w&
vscr_h&=h&
RETURN
lCookie ermitteln (nach Harder) GFA-Util
Autor: Peter Harder @ NF
Ich habe mir gerade mal eine Function zurechtgemacht, die die
'Adresse
eines Cookie ermittelt. Hier ist sie f
r alle, die sowas ebenfalls
gebrauchen k
nnen.
PRINT @cookie("
$NVDI")
PRINT @cookie("WINX")
PRINT @cookie("LTMF") ! LETEMFLY
FUNCTION cookie(code$)
$F%
LOCAL code%,cookie_ptr%,i%
cookie_ptr%=LPEEK(1440) ! LPEEK() statt LONG{}, sonst Bomben
IF cookie_ptr%>0 AND LEN(code$)=4
'
code%=CVL(code$)
'
FOR i%=cookie_ptr% TO cookie_ptr%+640 STEP 8
' PRINT MKL$({i%}) ! was ist
berhaupt alles da?
EXIT IF code%={i%} OR {i%}=0
NEXT i%
'
IF code%={i%}
RETURN i% ! Adresspointer zur
ck, Info mit {i%+4} auslesen
ELSE
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
ENDFUNC
lCookie ermitteln (nach ??) GFA-Util
Autor:
@ XYZ
DEFFN find_cookie(cookie$)=C:
(L:CVL(cookie$))
lVSCR-Cookie GFA-Util
Autor:
1Oliver Schildmann @ LU
eFrage:
nnte mal jemand so nett sein und posten, wie der VSCR-
Cookie aufgebaut ist und wie man mit seiner Hilfe Dialogboxen im
sichtbaren Bildschirmausschnitt zentriert?
Mein FORM_CENTER beachtet VSCR (wenn VSCR!=TRUE), kann aber die
Dialoge auch an die Mausposition setzen (wenn BOXPOS!=TRUE). Ist
MultiDialog installiert (legt Dialoge in Fenster, sehr zu empfehlen
unter MTOS), so wird die
bliche Dialogumrandung entfernt, da ja
jetzt ein Fensterrahmen existiert. Wird die
'Adresse des Dialoge
negativ
bergeben, so wird
ltrotz
d MultiDialog die Dialogumrandung
lnicht
d enfernt (MultiDialog kann dann vor dem Zeichnen abgeschaltet
werden).
' Globale Variablen:
' X.rez&, Y.rez&, Menu.h&, Mdia!, Mdia%, Vscr! und Boxpos!
' X.rez&=Succ(Work_out(0)) ! Maximale Aufl
sung in X-Richtung
' Y.rez&=Succ(Work_out(1)) ! Maximale Aufl
sung in Y-Richtung
' Menu.h& ist die H
he der Men
zeile (i.d.R. 19, ist identisch mit dem Y-
' Wert des Arbeitsbereiches Work.y&).
' ~@Mousex und ~@Mousey sind ein
-Ersatz f
r die GFA-Befehle
@Form_center(Dialog_adr%,X&,Y&,W&,H&) ! Mdia! & Mdia% werden aktualisiert
@Mdia(False) ! MultiDialog abschalten (wenn aktiv)
' Hier kommt der Dialog hin
@Mdia(True) ! MultiDialog ggf. wieder anschalten
> procedure Form_center(Adr%,Var X&,Y&,W&,H&) ! Form_center (VSCR & MDIA werden beachtet)
' -----------------------------
' FORM_CENTER (VSCR/MDIA/MOUSE)
' ----------------------------- 1.3 130494
' Parameter : Adr% (
'Adresse des zu zentrierenden Objektes, <0->kein MDIALOG)
' PreProc : -
' InlineProc: -
' InlineFunc: Mdia, Get.cookie
' Konstante : Vscr! (True, wenn Boxen zentriert werden sollen)
' Boxpos! (True, wenn Boxen an Mausposition)
' X.rez&, Y.rez&, Menu.h& (H
he der Men
zeile)
' Variable : -
ckgabe : X&,Y&,W&,H& (Position und Gr
e des Dialoges)
Local Work.x&,Work.y&,Work.w&,Work.h&
' Multi-Dialog!
If @Mdia And Adr%>0 ! Wenn MULTIDIALOG installiert
Ob_state(Adr%,0)=Bclr(Ob_state(Adr%,0),4) ! (und erw
nscht) OUTLINED off
Ob_spec(Adr%,0)=Bclr(Ob_spec(Adr%,0),17) ! Rahmendicke=0
Else ! Wenn nicht (oder deaktiviert)
Adr%=Abs(Adr%) ! Adr% ggf. zur
cksetzen
Ob_state(Adr%,0)=Bset(Ob_state(Adr%,0),4) ! OUTLINED on
Ob_spec(Adr%,0)=Bset(Ob_spec(Adr%,0),17) ! Rahmendicke=2
Endif
If Boxpos!
' Maus in der Mitte der Dialogbox
2' #UMBRUCH ANFANG!
X&=Max(3,Min(Sub(@Mousex,Div(Ob_w(Adr%,0),2))
,Sub(Sub(X.rez&,Ob_w(Adr%,0)),3)))
Y&=Max(Add(3+(Btst(Ob_state(Adr%,0),4)=False)*3,Menu.h&-
((Btst(Ob_state(Adr%,0),4))=False)*Menu.h&),Min
(Sub(@Mousey,Div(Ob_h(Adr%,0),2)),Sub(Sub(Y.rez&,
Ob_h(Adr%,0)),3)))
0' #UMBRUCH ENDE!
W&=Ob_w(Adr%,0)
H&=Ob_h(Adr%,0)
Ob_x(Adr%,0)=X&
Ob_y(Adr%,0)=Y&
Else if Vscr!
~@Get.
'cookie("VSCR",Vscr.
) ! Wenn Berechnung n
~Wind_get(0,7,Work.x&,Work.y&,Work.w&,Work.h&) ! Maximaler Arbeitsbereich
Vscr.x&=Card{Add(Vscr.
,10)} ! Bildschirmausschnitt: X-Wert
Vscr.y&=Card{Add(Vscr.
,12)} ! Bildschirmausschnitt: Y-Wert
Vscr.w&=Card{Add(Vscr.
,14)} ! Bildschirmausschnitt: Breite
Vscr.h&=Card{Add(Vscr.
,16)} ! Bildschirmausschnitt: H
W&=Sub(Ob_w(Adr%,0),Mul(6,Btst(Ob_state(Adr%,0),4))) ! Dialogma
e inkl. der
H&=Sub(Ob_h(Adr%,0),Mul(6,Btst(Ob_state(Adr%,0),4))) ! OUTLINE-Umrandung
X&=Add(Vscr.x&,Div(Vscr.w&-W&+Work.x&,2)) ! Dialog im Bildschirm zentrieren
Y&=Add(Vscr.y&,Div(Vscr.h&-H&+Work.y&,2)) ! und den Offset addieren
Ob_x(Adr%,0)=X&
Ob_y(Adr%,0)=Y&
Else ! Ansonsten nur normaler
-Aufruf,
If Ob_x(Adr%,0)=0 And Ob_y(Adr%,0)=0 ! wenn die Dialogbox nicht schon
~Form_center(Adr%,X&,Y&,W&,H&) ! plaziert worden ist!
Else
X&=Ob_x(Adr%,0)
Y&=Ob_y(Adr%,0)
W&=Ob_w(Adr%,0)
H&=Ob_h(Adr%,0)
Endif
Endif
Return
> function Mousex !
-Ersatz f
r GfA MOUSEX-Befehl
Local Mx%,My%,Mk%,Ut%
~Graf_mkstate(Mx%,My%,Mk%,Ut%)
Return Mx%
Endfunc
> function Mousey !
-Ersatz f
r GfA MOUSEY-Befehl
Local Mx%,My%,Mk%,Ut%
~Graf_mkstate(Mx%,My%,Mk%,Ut%)
Return My%
Endfunc
> function Mdia ! Ist MDIALOG installiert und aktiv?
' ------------
' MULTIDIALOG?
' ------------ 1.0 240394
' Parameter : -
' PreProc : -
' InlineProc: -
' InlineFunc: Get.cookie
' Konstante : Mdia! (MULTIDIALOG an/aus (TRUE/FALSE)
' Mdia% (
'Adresse des MDIA-Parameterblocks)
' Variable : -
' Ergebnis : TRUE, wenn MDIA existiert und aktiv ist, sonst FALSE
Mdia!=@Get.
'cookie("MDIA",Mdia%)
If Mdia!
Mdia!=Btst({Mdia%},31)
Clr Mdia%
Endif
Return Mdia!
Endfunc
> procedure Mdia(Flag&) ! MDIALOG an- und abschalten
' --------------------------
' MULTIDIALOG AN-/ABSCHALTEN
' -------------------------- 1.0 240394
' Parameter : Flag& (Wert wechseln (Change/1), setzen (True), l
schen (False)
' PreProc : -
' InlineProc: -
' InlineFunc: -
' Konstante : Mdia! (True, wenn MDIALOG installiert _und_ aktiv)
' Mdia% (MDIA-Cookie, ist <>0, wenn MDIALOG installiert ist)
' Variable : -
If Mdia! ! Ist MDIALOG installiert und ist oder war es aktiv
If Flag&=True ! MDIALOG einschalten
{Mdia%}=Bset({Mdia%},31)
Else if Flag&=False ! MDIALOG ausschalten
{Mdia%}=Bclr({Mdia%},31)
Else ! MDIALOG-Status wechseln
{Mdia%}=Bchg({Mdia%},31)
Endif
Endif
Return
lStringmanipulationen GFA-Util
7.1
7.2
7.3
7.4
7.5
7.6
7.7
7.8
7.9
7.10
7.11
7.12
lString teilen GFA-Util
Autor:
0Gregor Duchalski @ DO
' Gibt den ersten Teil eines durch '|' abgeteilten Strings zur
ck und
' verk
rzt den Originalstring...
' Beispiel: a$="ABC|DEF" ==> @teil$(a$)="ABC"; a$="DEF"
> FUNCTION teil$(VAR a$)
LOCAL b$,a&
a&=INSTR(a$,"|")
IF a&
b$=LEFT$(a$,PRED(a&))
a$=MID$(a$,SUCC(a&))
ELSE
b$=a$
a$=""
ENDIF
RETURN b$
ENDFUNC
lString einf
gen GFA-Util
Autor:
0Gregor Duchalski @ DO
gt in den String b$ den String a$ an der Position a& ein...
> PROCEDURE insert(a$,a&,VAR b$)
LOCAL c$
c$=LEFT$(b$,PRED(a&))
c$=c$+a$+MID$(b$,a&)
b$=c$
RETURN
schen eines Teilstrings GFA-Util
Autor:
0Gregor Duchalski @ DO
scht in a$ ab Position a& 'b&'-Zeichen...
> PROCEDURE delete(a&,b&,VAR a$)
LOCAL c$
c$=LEFT$(a$,PRED(a&))
c$=c$+MID$(a$,a&+b&)
a$=c$
RETURN
lErsetzen in einem String (als Prozedur) GFA-Util
Autor:
0Gregor Duchalski @ DO
' Ersetzen in einem String...
' Ersetzt in a$ ab Position a& 'b&'-positionen durch b$...
> PROCEDURE replace(a&,b&,b$,VAR a$)
c$=LEFT$(a$,PRED(a&))
c$=c$+b$+MID$(a$,a&+b&)
a$=c$
RETURN
lErsetzen in einem String (als Funktion) GFA-Util
Autor: Peter Harder @ NF
FUNCTION replace$(strng$,raus$,rein$)
' Aufrufbeispiel:
' PRINT @replace$("Muetze","ue","
") ! schreibt "M
LOCAL right$,len_dif&,pos&,beg&
len_dif&=LEN(rein$)-LEN(raus$)
pos&=INSTR(strng$,raus$)
WHILE pos&
'
right$=MID$(strng$,pos&+LEN(raus$))
IF LEN(strng$)+len_dif&<=32767
strng$=LEFT$(strng$,pos&-1)+rein$+right$
ENDIF
'
beg&=pos&+1+len_dif&
pos&=INSTR(beg&,strng$,raus$)
WEND
RETURN strng$
ENDFUNC
lAbschneiden von Leerzeichen GFA-Util
Autor:
0Gregor Duchalski @ DO
' Abschneiden der Leerzeichen am linken bzw. rechten Rand eines
' Strings...
> FUNCTION ltrim$(a$)
FOR i&=1 TO LEN(a$)
IF MID$(a$,i&,1)=" "
INC pos&
ELSE
i&=LEN(a$)
ENDIF
NEXT i&
a$=RIGHT$(a$,SUB(LEN(a$),pos&))
RETURN a$
ENDFUNC
> FUNCTION rtrim$(a$)
pos&=LEN(a$)
FOR i&=LEN(a$) DOWNTO 1
IF MID$(a$,i&,1)=" "
DEC pos&
ELSE
i&=1
ENDIF
NEXT i&
a$=LEFT$(a$,pos&)
RETURN a$
ENDFUNC
lBlocksatz GFA-Util
Autor:
0Gregor Duchalski @ DO
' Blocksatz...
> FUNCTION blocksatz$(a$,a&)
LOCAL b&,c&
b&=1
c&=a&-LEN(a$)
WHILE c&>0
b&=INSTR(a$," ",b&)
IF b&=0
b&=1
b&=INSTR(a$," ",b&)
ENDIF
a$=LEFT$(a$,b&)+" "+RIGHT$(a$,LEN(a$)-b&)
ADD b&,2
DEC c&
WEND
RETURN a$
ENDFUNC
lEinf
gen von Dezimalpunkten GFA-Util
Autor:
0Gregor Duchalski @ DO
gt in eine Zahl die Dezimalpunkte ein (z.B. 1234="1.234")...
> FUNCTION dez.pkt$(a%)
LOCAL a$,b$,i&
a$=STR$(a%)
b$=""
FOR i&=LEN(a$)-3 TO 1 STEP -3
b$="."+MID$(a$,SUCC(i&),3)+b$
NEXT i&
b$=LEFT$(a$,(i&+3))+b$
RETURN b$
ENDFUNC
lEinf
gen von Nullen GFA-Util
Autor:
0Gregor Duchalski @ DO
gt in eine Zahl a& Nullen ein, bis L
nge b& erreicht...
DEFFN null$(a&,b&)=RIGHT$(STRING$(b&,"0")+STR$(a&),b&)
lLOWER$ = Gegenst
ck zu UPPER$ GFA-Util
Autor:
/Michael Wedding @ AC3
' ---------------------------------
' LOWER$ = Gegenst
ck zu UPPER$!
' Wandelt Gro
- in Kleinbuchstaben.
/Michael Wedding, Jul 21 1992
> FUNCTION lower$(b$)
LOCAL i|,adr%,asc|,offset
%adr%=V:b$
FOR i|=0 TO PRED(LEN(b$))
offset%=adr%+i|
asc|=BYTE{offset%}
SELECT asc|
CASE 65 TO 90
BYTE{offset%}=asc|+32
CASE 128
BYTE{offset%}=asc|+7
CASE 142
BYTE{offset%}=asc|-10
CASE 143
BYTE{offset%}=asc|-9
CASE 144
BYTE{offset%}=asc|-14
CASE 146,165,181,193
BYTE{offset%}=asc|-1
CASE 153
BYTE{offset%}=asc|-5
CASE 154
BYTE{offset%}=asc|-25
CASE 178
BYTE{offset%}=asc|+1
CASE 182
BYTE{offset%}=asc|-49
CASE 183,184
BYTE{offset%}=asc|-7
ENDSELECT
NEXT i|
RETURN b$
ENDFUNC
' ---------------------------------
lcut_left_str() GFA-Util
Autor: Frank R
ger @ OS2
Die FUNCTION cut_left_str(VAR in$,out$) arbeitet
hnlich, wie die C-
Funktion strtok() mit dem Trennzeichen " " (Space) und liefert als
Return die L
nge von out$. In out$ steht anschlie
end der erste
String aus in$ von links bis zum ersten Space (oder in$, falls kein
Space enthalten ist) und in in$ der Rest von in$ nach dem Abschneiden
von out$.
FUNCTION cut_left_str(VAR in$,out$)
$F%
LOCAL space&
in$=TRIM$(in$)
space&=INSTR(in$," ")
IF space&
out$=LEFT$(in$,PRED(space&))
in$=TRIM$(MID$(in$,SUCC(space&)))
ELSE
out$=in$
CLR in$
ENDIF
RETURN LEN(out$)
ENDFUNC
lAuff
llen mit Nullen GFA-Util
Autor:
0Gregor Duchalski @ DO
' Auff
llen mit Nullen...
> FUNCTION format$(a,a&)
LOCAL a$,b&
a$=STR$(a)+STRING$(SUCC(a&),"0")
b&=INSTR(a$,".")
RETURN LEFT$(a$,b&)+LEFT$(RIGHT$(a$,SUB(LEN(a$),b&))+"00",a&)
ENDFUNC
lSuchen GFA-Util
8.1
8.2
8.3
8.4
8.5
l'Boyer Moore' Suchalgorythmus GFA-Util
Autor:
@ XYZ
' Beispiel f
r Boyer Moore...
$m20000
RESERVE 200000
inlines
OPEN "i",#1,"e:\dfue\database\itb.txt" ! ITB.TXT der Maus...
flen%=LOF(#1)
PRINT "L
nge: ";flen%;" Bytes"
adr%=MALLOC(flen%)
IF adr%>0
t%=TIMER
BGET #1,adr%,flen%
PRINT "Zeit f
r Laden: ";(TIMER-t%)/200
CLOSE #1
s$="*AC3"
t%=TIMER
ptr%=@find_boyer(adr%,flen%,s$)
PRINT "Zeit f
r Suche: ";(TIMER-t%)/200
IF ptr%
PRINT "Gefunden an
'Adresse: ";ptr%
PRINT "Offset: ";ptr%-adr%
ELSE
PRINT "Nix gefundet!"
ENDIF
~MFREE(adr%)
~INP(2)
EDIT
ALERT 1,"Kein Speicher!",1,"OK",ret%
CLOSE #1
ENDIF
> FUNCTION find_boyer(buffer%,len%,ss$)
LOCAL ss.len&
ss.len&=LEN(ss$)
PRINT "Buffer: ";buffer%
PRINT "Len: ";len%
PRINT "Adr S$: ";V:ss$
PRINT "S$-Len: ";STR$(ss.len&)
PRINT "sbuf%: ";sbuf%
RETURN C:
(L:buffer%,L:len%,L:V:ss$,ss.len&,L:sbuf%,L:
ENDFUNC
> PROCEDURE inlines
' Eigentliche Suchroutine
INLINE
,316
' Inline mit dem Zeichensatz... Musst Du mal mit rumprobieren...
' Wenn alle Zeichen auf Grossbuchstaben stehen, dann wird - glaube
' ich - nicht danach unterschieden. Ist im Inline Gross- sowie klein-
' schrift vorhanden, so wird beim
auch nach gross oder klein
' unterschieden
INLINE
,256
' sbuf% wird von Booyer Moore ben
tigt und sollte vor der Suche
' gel
scht werden.
INLINE sbuf%,1000
a$=SPACE$(1000)
BMOVE V:a$,sbuf%,1000
RETURN
lDateinamen suchen GFA-Util
Autor:
@ XYZ
GOSUB dir("F:\CALAMUS\FONTS\","*.CFN") ! Aufruf der Routine um den
! Ordner zu durchsuchen...
QSORT datei$(),datei_count& ! Alle Daten sortieren...
' Sortierte dateien anzeigen...
PRINT datei$(i&)
INC i&
LOOP UNTIL i&>datei_count&
~INP(2) ! Auf taste warten
PROCEDURE dir(path$,msk$)
LOCAL datei$,fertig&
ERASE datei$()
DIM datei$(1000)
~FSETDTA(BASEPAGE+128)
datei_count&=0
fertig&=FSFIRST(path$+msk$+CHR$(0),7) ! Erste Datei suchen..
DO UNTIL fertig& ! wenn 1. o. n
chste gefunden
datei$=CHAR{FGETDTA()+30} ! Dateiname ermitteln
INC datei_count& ! Zaehler
datei$(datei_count&)=path$+datei$ ! ARRAY belegen
fertig&=FSNEXT() ! N
chste suchen...
LOOP
RETURN
lSuchen in einem eindimensionalen Stringfeld GFA-Util
Autor:
0Gregor Duchalski @ DO
' Suchen in einem eindimensionalen Stringfeld : von,bis,feld,such$...
> FUNCTION instr(a&,b&,VAR a$(),b$)
IF b&>PRED(DIM?(a$()))
ALERT 3," | Funktion INSTR nicht | durchf
hrbar! ",1,"Abbruch",b&
ELSE
IF a&=-1
a&=1
b&=PRED(DIM?(a$()))
ENDIF
FOR i&=a& TO b&
IF a$(i&)=b$
RETURN i&
ENDIF
NEXT i&
ENDIF
RETURN -1
ENDFUNC
lSuchen in einem Speicherbereich GFA-Util
Autor:
0Gregor Duchalski @ DO
' Sucht den String 'find$' an der
'Adresse 'adr%' im Speicherbereich
' mit der L
nge 'l%'...
> FUNCTION find_string(find$,adr%,l%) ! Search a string
$F%
LOCAL len&,a&,a%,a$
' last change 14.04.93
len&=MIN(l%,4100) ! L
nge des Teilstrings
a$=STRING$(len&,0) ! Teilstring
a%=adr% ! Startadresse
end%=ADD(adr%,PRED(l%)) ! Endadresse
DO WHILE ADD(a%,len&)<end%
BMOVE a%,V:a$,len&
ADD a%,len&
a&=INSTR(a$,find$)
LOOP UNTIL a&
rest&=SUB(end%,PRED(a%))
IF a&=0 AND rest&>0
BMOVE a%,V:a$,rest&
ADD a%,len&
a&=INSTR(a$,find$)
ENDIF
IF a&
RETURN a%-len&+PRED(a&)
ENDIF
RETURN 0
ENDFUNC
lSuchen (Berger'sche Variante) GFA-Util
Autor: Axel Berger @ RS
neustart:
select
' ------------------------
> PROCEDURE init
DEFSTR "a-b"
DEFBYT "i-j"
DEFWRD "k-n"
DEFINT "l"
OPTION BASE 0
' -----------
version$="1.50"
versdat$="93-10-20"
apath=":\*.*"
astri=""
alist="C:\CLIPBRD\FILE_FAB.LST"
' -----------
ON ERROR GOSUB fehler
CLOSE
CLS
RETURN
> PROCEDURE fehler
LOCAL ausgang,i
IF FATAL
~FORM_ALERT(1,ERR$(ERR))
CLOSE
END
ELSE
ausgang=ERR$(ERR)
ausgang=LEFT$(ausgang,RINSTR(ausgang,"]",LEN(ausgang)-2)-1)
i=
#MAX(0,22+MAX(RINSTR(ausgang,"|"),RINSTR(ausgang,"["))-LEN(ausgang))
ausgang=ausgang+STRING$(i," ")+"][Abbruch|Weiter|Neustart]"
i=FORM_ALERT(1,ausgang)
IF i=2
ON ERROR GOSUB fehler
RESUME NEXT
ELSE IF i=3
ON ERROR GOSUB fehler
RESUME neustart
ELSE
CLOSE
END
ENDIF
ENDIF
RETURN
' ------------------------
> PROCEDURE select
LOCAL i,nolist,a,m,k
CLOSE
CLS
lfile=0
PRINT "SUCH_FAB, Version: ";version$
PRINT " vom: ";versdat$
PRINT "Suchpfad: ";
a=apath
FORM INPUT 255 AS a
IF a=""
m=1
m=FSEL_INPUT(apath,a,k)
EXIT IF m*k=0
IF LEN(a)
apath=LEFT$(apath,RINSTR(apath,"\"))+a
ELSE
apath=LEFT$(apath,RINSTR(apath,"\"))+"*.*"
ENDIF
PRINT " ASuchpfad: ";apath
ELSE
apath=UPPER$(a)
EXIT IF NOT INSTR(apath,":\")=2
EXIT IF NOT RINSTR(apath,".")>RINSTR(apath,"\")
ENDIF
' -------
PRINT "Suchstring: ";
FORM INPUT 255 AS astri
PRINT "Ausgabe in: ";
FORM INPUT 255 AS alist
IF alist=""
nolist=1
ELSE
OPEN "o",#2,alist
nolist=0
ENDIF
find(apath,astri,nolist)
PRINT CHR$(7)
CLOSE
IF CRSLIN>15 AND LEN(astri)=0
WHILE INKEY$="" AND MOUSEK=0
WEND
CLS
ENDIF
PRINT "Es wurden ";lfile;" Files nach """+astri+""" durchsucht."
PRINT
PRINT
PRINT
LOOP
RETURN
> PROCEDURE find(ap,as,n)
LOCAL adta,aext,afile,k,i
IF UPPER$(LEFT$(ap))="X"
FOR i=ASC("C") TO ASC("P")
MID$(ap,1)=CHR$(i)
find(ap,as,n)
NEXT i
ELSE IF INKEY$=" "
ERROR 7
ELSE
adta=STRING$(50," ")
~FSETDTA(VARPTR(adta))
' -----------
aext=MID$(ap,RINSTR(ap,"\"))
k=FSFIRST(ap,&X100111)
ap=LEFT$(ap,RINSTR(ap,"\"))
DO UNTIL k
afile=ap+CHAR{VARPTR(adta)+30}
seek(afile,as,n)
~FSETDTA(VARPTR(adta))
k=FSNEXT()
LOOP
' -----------
k=FSFIRST(ap+"*.*",16)
DO UNTIL k
afile=CHAR{VARPTR(adta)+30}
IF PEEK(VARPTR(adta)+21)=16 AND NOT (afile="." OR afile="..")
afile=ap+afile+aext
find(afile,as,n)
~FSETDTA(VARPTR(adta))
ENDIF
k=FSNEXT()
LOOP
' -----------
ENDIF
RETURN
> PROCEDURE seek(af,as,n)
LOCAL adta,lang,l,neu,block,mpos,manf,mend
adta=STRING$(50," ")
~FSETDTA(VARPTR(adta))
IF EXIST(af)
lfile=lfile+1
PRINT lfile;": "+af
IF LEN(as)
OPEN "I",#1,af
lang=LOF(#1)
FOR l=1 TO lang-1 STEP 31000
SEEK #1,l-1
neu=MIN(32000,lang-l+1)
block=INPUT$(neu,#1)
mpos=INSTR(block,as)
WHILE mpos
manf=
#MAX(1,mpos-34)
mend=MIN(mpos+44,lang)
PRINT " p"+MID$(block,manf,mend-manf+1)+" q"
PRINT lfile;": "+af+CHR$(7)
IF n=1
WHILE INKEY$="" AND MOUSEK=0
WEND
ELSE
PRINT #2,lfile;": "+af
PRINT #2,MID$(block,manf,mend-manf+1)
PRINT #2,lfile;": "+af
ENDIF
mpos=INSTR(block,as,mpos+1)
WEND
NEXT l
CLOSE #1
ELSE
IF n=0
datum(adta,block)
PRINT #2,block;af
' PRINT #2,lfile;": "+af
ELSE IF CRSLIN>23
PRINT CHR$(7);
WHILE INKEY$="" AND MOUSEK=0
WEND
CLS
ENDIF
ENDIF
ELSE
ERROR 23
ENDIF
RETURN
> PROCEDURE datum(VAR adta,block)
LOCAL lfile,mdat,mtim
block=" "
RETURN
lSortieren GFA-Util
9.1
9.2
lDateinamen sortieren GFA-Util
Autor:
@ KR
REM Array erstellen
DIM string$(99) ! Nur f
r Testzwecke
fuellzeichen$=CHR$(0) ! Kleinster ASCII-Wert
max_dat_len|=8 ! So lang ist ein 'kurzer' Dateiname
REM ... und belegen
FOR i|=1 TO 99
string$(i|)="File_"+STR$(i|)
NEXT i|
REM Auff
llen mit den F
llzeichen
FOR i|=0 TO 99 ! Alle Strings durchgehen
REM Zahlen suchen...
FOR z&=0 TO LEN(string$(i|))
IF VAL?(MID$(string$(i|),z&,1))<>0
p&=z&
anz&=VAL(MID$(string$(i|),PRED(z&)))
ENDIF
NEXT z&
IF p&<>0 ! Wenn eine Zahl gefunden wurde...
'
REM Linker Teil des Strings geht bis Anfang Zahl
'
leftstring$=LEFT$(string$(i|),PRED(p&))
'
REM F
llstring zum Auff
llen mit CHR$(0) auf max_dat_len|
'
fuellstring$=STRING$(max_dat_len|-LEN(string$(i|)),fuellzeichen$)
'
REM Rechter Teil d. Strings geht ab Ende d. Zahl bis Ende String
'
rightstring$=RIGHT$(string$(i|),SUCC(LEN(string$(i|))-p&))
'
REM Alles zusammenpappen...
'
string$(i|)=leftstring$+fuellstring$+rightstring$
'
ENDIF
NEXT i|
QSORT string$()
REM ... und wieder auseianderdr
FOR i|=0 TO 99
string$=string$(i|)
p|=INSTR(string$,fuellzeichen$)
EXIT IF p|=0
delete(p|,1,string$)
LOOP
string$(i|)=string$
NEXT i|
REM und feddich...
lSortieren (nach Skuplik) GFA-Util
Autor: Roland Skuplik @ DO2
Nachfolgend eine Routine, die eine Stringfeld von l| bis r| sortiert,
und zwar nach dem QUICK-SORT-Algorithmus!
r andere Anwendungen etwas umschreiben, aber das Prinzip sollte
daraus klar werden.
'PROCEDURE quick(l|,r|)
LOCAL i|,j|,x|
i|=l|
j|=r|
x$=feld$((l|+r|) DIV 2)
REPEAT
WHILE feld$(i|)<x$
INC i|
WEND
WHILE x$<feld$(j|)
DEC j|
WEND
IF i|<=j|
SWAP feld$(i|),feld$(j|)
INC i|
DEC j|
ENDIF
UNTIL i|>j|
IF l|<j|
quick(l|,j|)
ENDIF
IF i|<r|
quick(i|,r|)
ENDIF
RETURN
lRoutinen rund um's Datum GFA-Util
10.1
10.2
10.3
10.4
10.5
10.6
10.7
10.8
10.9
lDatumsroutinen GFA-Util
Autor:
@ XYZ
' Datumsroutinen in GFA-Basic
' Beipiel:
PRINT "Es ist "+@
,welcher_tag$(23,1,1994)+"!"
PRINT "Es ist der "+STR$(@
&tag_nr(23,1,94))+". tag im Jahr"
PRINT tnr% ! Da steht dann das Ergebnis drin ..
t1%=23
m1%=1
j1%=94
anz%=37 ! normal = ADD / mit "-" davor = SUB
GOSUB
+dat_rechnen(t1%,m1%,j1%,anz%,t%,m%,j%)
PRINT t1%;".";m1%;".";j1%;" ";anz%;" Tage = ";t%;".";m%;".";j%
lDer wievielte Tag im Jahr ist heute? GFA-Util
Autor:
@ XYZ
> FUNCTION tag_nr(t%,m%,j%)
' Der wievielte tag im Jahr ist heute?
IF m%>2
tnr%=INT((m%+1)*30.6)-63+t%
IF j% MOD 4=0
INC tnr% ! Schaltjahr
ENDIF
ELSE
tnr%=INT((m%+13)*30.6)-428+t%
ENDIF
RETURN tnr%
ENDFUNC
lDer wievielte Tag ist heute? GFA-Util
Autor:
@ XYZ
> FUNCTION tag_zahl(t%,m%,j%)
' Berechnet den genauen Tag. Gerechnet ab dem 1.3.0000
IF m%>2
SUB m%,3
ELSE
ADD m%,9
DEC j%
ENDIF
jh%=j%/100
jt%=j%-100*jh%
RETURN INT(146097*jh%/4)+INT(1461*jt%/4)+INT((153*m%+2)/5)+t%
ENDFUNC
lAbsolutes Datum -> Kalenderdatum GFA-Util
Autor:
@ XYZ
> PROCEDURE recalc(tnr%,VAR t%,m%,j%)
' Rechnet absolutes Datum wieder zur
ck in Kalenderdatum
j%=(4*tnr%-1)/146097
tnr%=4*tnr%-146097*j%-1
t%=tnr%/4
tnr%=(t%*4+3)/1461
t%=4*t%+3-1461*tnr%
t%=(t%+4)/4
m%=(5*t%-3)/153
t%=((5*t%-3-153*m%)+5)/5
j%=100*j%+tnr%
IF m%<10
ADD m%,3
ELSE
SUB m%,9
INC j%
ENDIF
RETURN
lWelcher Wochentag ist heute? GFA-Util
Autor:
@ XYZ
tigt wird: '
(tag_zahl'
> FUNCTION welcher_tag$(t%,m%,j%)
' Welcher Wochentag ist heute?
RESTORE wochentage
IF in!=FALSE
DIM n$(6)
wochentage:
DATA Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag
FOR i%=0 TO 6
READ n$(i%)
NEXT i%
in!=TRUE
ENDIF
tz%=@
(tag_zahl(t%,m%,j%)
wt%=(tz%-719750+5)-INT((tz%-719750+5)/7)*7 ! In Relation zu 9.10.1970
RETURN n$(wt%)
ENDFUNC
lDifferenz zwischen zwei Daten GFA-Util
Autor:
@ XYZ
tigt wird: '
(tag_zahl'
> FUNCTION dat_dif(t1%,m1%,j1%,t2%,m2%,j2%)
' Differenz zwischen zwei Daten
RETURN ABS(@
(tag_zahl(t1%,m2%,j1%)-@tag_zahl(t2%,m2%,j2%))
ENDFUNC
lRechnet mit Daten GFA-Util
Autor:
@ XYZ
tigt wird: '
(tag_zahl' und '
&recalc'
> PROCEDURE dat_rechnen(t1%,m1%,j1%,a%,VAR t2%,m2%,j2%)
LOCAL tnr%
' 'dat_rechnen' addiert einen Wert zu einem Datum.
' Bzw. wenn a% negativ ist, wird subtrahiert.
tnr%=@
(tag_zahl(t1%,m1%,j1%)
ADD tnr%,a%
GOSUB
&recalc(tnr%,t2%,m2%,j2%)
RETURN
lUnix-Datum in echtes Datum wandeln GFA-Util
Autor:
@ XYZ
init_time_constants_and_variables ! Einmal am Anfang aufrufen
DIM lt&(8)
IF @localtime(782497122,lt&())
PRINT RIGHT$("0"+STR$(lt&(tm_mday&)),2);".";
PRINT RIGHT$("0"+STR$(SUCC(lt&(tm_mon&))),2);".";
PRINT STR$(1900+lt&(tm_year&))'
PRINT RIGHT$("0"+STR$(lt&(tm_hour&)),2);":";
PRINT RIGHT$("0"+STR$(lt&(tm_min&)),2);":";
PRINT RIGHT$("0"+STR$(lt&(tm_sec&)),2)
ENDIF
' 18.10.1994 16:18:42
PROCEDURE init_time_constants_and_variables
' ++SYM
' struct tm
LET tm_sec&=0
LET tm_min&=1
LET tm_hour&=2
LET tm_mday&=3
LET tm_mon&=4
LET tm_year&=5
LET tm_wday&=6
LET tm_yday&=7
LET tm_isdst&=8
LET secs_per_min%=60
LET secs_per_hour%=3600
LET secs_per_day%=86400
LET secs_per_year%=31536000
LET secs_per_leapyear%=31622400
' ++SYM
LET timezone_%=-1
DIM days_per_mth&(11)
LET days_per_mth&(0)=31
LET days_per_mth&(1)=28
LET days_per_mth&(2)=31
LET days_per_mth&(3)=30
LET days_per_mth&(4)=31
LET days_per_mth&(5)=30
LET days_per_mth&(6)=31
LET days_per_mth&(7)=31
LET days_per_mth&(8)=30
LET days_per_mth&(9)=31
LET days_per_mth&(10)=30
LET days_per_mth&(11)=31
LET dst%=-1
RETURN
PROCEDURE tz_set
timezone_%=@tzoffset(@getenv$("TZ"),dst%)
RETURN
FUNCTION getenv$(a$)
$F%
LOCAL a!
LOCAL a%
LOCAL b$
LOCAL trenn$
a%=PRED({ADD(BASEPAGE,44)})
REPEAT
ADD a%,SUCC(LEN(b$))
b$=CHAR{a%}
IF INSTR(b$,a$)=1
trenn$=MID$(b$,SUCC(LEN(a$)),1)
IF trenn$="=" OR trenn$=" " OR trenn$=""
a!=-1
IF trenn$=""
b$=""
ELSE
b$=MID$(b$,ADD(LEN(a$),2))
ENDIF
ENDIF
ENDIF
UNTIL b$="" OR a!
RETURN b$
ENDFUNC
FUNCTION gmtime_(t%,VAR stm&())
LOCAL time%
LOCAL year&
LOCAL mday&
LOCAL i&
time%=t%
IF time%<0
RETURN FALSE
ENDIF
stm&(tm_wday&)=MOD(ADD(DIV(time%,secs_per_day%),4),7)
year&=70
EXIT IF time%<secs_per_year%
IF MOD(year&,4)=0
EXIT IF time%<secs_per_leapyear%
SUB time%,secs_per_leapyear%
ELSE
SUB time%,secs_per_year%
ENDIF
INC year&
LOOP
stm&(tm_year&)=year&
stm&(tm_yday&)=DIV(time%,secs_per_day%)
mday&=stm&(tm_yday&)
IF MOD(year&,4)
days_per_mth&(1)=28
ELSE
days_per_mth&(1)=29
ENDIF
WHILE mday&>=days_per_mth&(i&)
SUB mday&,days_per_mth&(i&)
INC i&
WEND
stm&(tm_mon&)=i&
stm&(tm_mday&)=SUCC(mday&)
time%=MOD(time%,secs_per_day%)
stm&(tm_hour&)=DIV(time%,secs_per_hour%)
time%=MOD(time%,secs_per_hour%)
stm&(tm_min&)=DIV(time%,secs_per_min%)
stm&(tm_sec&)=MOD(time%,secs_per_min%)
stm&(tm_isdst&)=0
RETURN TRUE
ENDFUNC
FUNCTION indst(s%,VAR t&())
IF t&(tm_mon&)=3
IF t&(tm_year&)<87 AND SUB(ADD(t&(tm_wday&),30),t&(tm_mday&))<7
RETURN TRUE
ENDIF
IF SUB(t&(tm_wday&),t&(tm_mday&))<0
RETURN TRUE
ENDIF
RETURN FALSE
ENDIF
IF t&(tm_mon&)=9
IF SUB(ADD(t&(tm_wday&),31),t&(tm_mday&))<7
RETURN 0
ENDIF
RETURN TRUE
ENDIF
RETURN t&(tm_mon&)>3 AND t&(tm_mon&)<9
ENDFUNC
FUNCTION localtime(t%,VAR stm&())
LOCAL gmsecs%
tz_set
gmsecs%=t%-timezone_%
IF NOT @gmtime_(gmsecs%,stm&())
RETURN FALSE
ENDIF
IF dst%=-1
stm&(tm_isdst&)=-1
ELSE
stm&(tm_isdst&)=0
ENDIF
IF dst%=1 AND @indst(t%,stm&())
stm&(tm_isdst&)=1
INC stm&(tm_hour&)
IF stm&(tm_hour&)>23
SUB stm&(tm_hour&),24
stm&(tm_wday&)=MOD(SUCC(stm&(tm_wday&)),7)
INC stm&(tm_yday&)
INC stm&(tm_mday&)
IF stm&(tm_mday&)>days_per_mth&(stm&(tm_mon&))
stm&(tm_mday&)=1
INC stm&(tm_mon&)
ENDIF
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
FUNCTION tzoffset(s$,VAR hasdst%)
LOCAL off%
LOCAL x&
LOCAL sgn&
LOCAL i&
sgn&=1
hasdst%=-1
IF s$=""
RETURN 0
ENDIF
hasdst%=0
WHILE i&<=LEN(s$)
INC i&
SELECT ASC(MID$(s$,i&))
CASE TO 64,91 TO 96,123 TO
EXIT IF -1
ENDSELECT
WEND
s$=MID$(s$,i&)
IF LEFT$(s$)="-"
sgn&=-1
s$=MID$(s$,2)
ENDIF
x&=VAL(s$)
off%=MUL(x&,secs_per_hour%)
s$=MID$(s$,SUCC(VAL?(s$)))
IF LEFT$(s$)=":"
s$=MID$(s$,2)
x&=VAL(s$)
ADD off%,MUL(x&,secs_per_minute%)
ENDIF
RETURN sgn&*off%
ENDFUNC
lZeitdifferenz berechnen GFA-Util
Autor: Roland Skuplik @ DO2
t1$="15:58:11"
PRINT t1$
t2$="16:02:05"
PRINT t2$
t1%=@in_sekunden(t1$)
t2%=@in_sekunden(t2$)
differenz%=SUB(t2%,t1%)
PRINT differenz%'"Sekunden"
PRINT @zeit$(differenz%)
FUNCTION in_sekunden(z$)
$F%
2' #UMBRUCH ANFANG!
RETURN ADD(ADD(VAL(MID$(z$,7,2)),MUL(VAL(MID$(z$,4,2)),60)),
MUL(VAL(MID$(z$,1,2)),3600))
0' #UMBRUCH ENDE!
ENDFUNC
FUNCTION zeit$(s%)
RETURN
2' #UMBRUCH ANFANG!
RIGHT$("0"+STR$(DIV(s%,3600)),2)+":"+RIGHT$("0"+STR$(DIV(MOD
(s%,3600),60)),2)+":"+RIGHT$("0"+STR$(MOD(MOD(s%,3600),60)),2)
0' #UMBRUCH ENDE!
ENDFUNC
lKOBASCH - KOBold-Acc-SCHnitstelle GFA-Util
Autor:
@ AC3
MODULE KOBASCH -
dold-
dnittstelle
(C) 1993
H
ttenstr. 46
D-52068 Aachen
Version: 0.3 24.10.1993
11.1
11.2
11.3
11.4
lDokumentation zu KOBASCH GFA-Util
eTIP's, die man beachten sollte:
Wenn man mit dem KOBOLD als
#ACC arbeitet, sollte man den Job, der
durchgef
hrt werden soll, in Einzelschritten abarbeiten.
Grund: Ich habe des
fteren Probleme mit Speicherjob's gehabt, wenn
sie zu lang sind.
Wie wird's also gemacht?
Zum l
schen mehrerer Dateien oder Ordner in einem Startpfad oder bei
komplexen Job's (Backup, BAK-Killer) sollte man etwa so vorgehen:
&Kobold aufrufen mit
-k2_src_select
Zielpfad mit
-k2_dst_select einstellen
Dateien oder Ordner mit
)k2_select selektieren
Selektierte Daten mit
'k2_copy kopieren oder verschieben
&Kobold-Aktionen mit kobold_close beenden
eAufgabe der Proceduren:
'k2_init
Sollte bei Programmstart einmal aufgerufen werden. Hier
werden alle n
tigen Varialen deklariert und der Speicher
(4kb) f
r den Job reserviert.
'k2_exit
Sollte bei Programm-Ende aufgerufen werden. Hier wird der
Speicher f
r den Job wieder freigegeben und die
Dimensionierung des MSG- Puffers aufgehoben.
0k2_copy_and_quit
Dient zum Kopieren oder Verschieben von einem Ordner bzw.
einer Datei.
2k2_delete_and_quit
Dient zum L
schen eines Ordners bzw. einer Datei.
-k2_src_select
Dient zum Ausw
hlen des Quellpfad's bzw. zum Aktivieren des
KOBOLD.
-k2_dst_select
Dient zum Ausw
hlen des Zielpfades.
'k2_copy
Dient zum Kopieren oder Verschieben der durch
)k2_select
selektierten Daten.
)k2_select
Dient zum Selektieren eines/einer Ordners/Datei. Es muss
vorher
-k2_src_select aufgerufen worden sein.
)k2_delete
Dient zum l
schen der mit
)k2_select selektierten Daten.
(k2_close
Dient zum Schliessen des
&Kobold-Dialog's (KOBOLD-Beenden).
)k2_konfig
Dient zum Erfragen der KOBOLD-Konfiguration. Variablen-Namen
entsprechen der Deklaration in GERUEST.C auf der
&Kobold-
Diskette. Bis auf gemdos_mode sind das alles WORD-Variablen
(&)! gemdos_mode selbst ist als String ($) abgelegt. Der
Aufbau des Strings ist identisch mit dem Parameter beim
Befehl GEMDOS_MODE! Angenommen LW A: und B: sind bei KOBOLD
auf GEMDOS_MODE eingestellt. gemdos_mode$ sieht dann so aus:
ABcdefghijklmnopqrstuvwxyz
Merke: Laufwerke ab U: (Multitos o.
.) sollten mit KOBOLD
'AUF JEDEN FALL' im GEMDOS_MODE benutzt werden, da sich diese
nur
ansprechen lassen. Also:
GEMDOS_MODE = (ABcdefghijklmnopqrstUVWXYZ)
)k2_dialog,
*k2_adresse und
'k2_exec werden von den anderen Proceduren
aus aufgerufen. Sie brauchen nicht beachtet zu werden, d
rfen aber
auch nicht gel
scht werden!
-k2_init_texte wird in dieser Version noch nicht ben
tigt!
lBeispiel zu KOBASCH GFA-Util
Autor:
@ AC3
' DEMO zu KOBASCH (C) 1993 by M.Ssykor
$M5120 ! 5 Kb Speicher reservieren
' Compiler Einstellungen
$*& ! Longwort-Integer-Multiplikation - 'MULS'
$%3 ! Longwort-Integer-Division - Integer
$RC& ! RC_INTERSECT-Parameter als 2 Byte
$I- ! BREAK-Tasten und EVERY/AFTER-Abfrage nicht einbauen
$S< ! SELECT/CASE auf Programml
nge optimiert
$S& ! SELECT/CASE-Parameter im 2 Byte-Format
$E- ! Fehlermeldungen aus
$F< ! ENDFUNC-Zeilen ignorieren
~GRAF_MOUSE(0,0)
~WIND_GET(0,7,xx&,yy&,ww&,hh&)
~FORM_DIAL(3,xx&,yy&,ww&,hh&,xx&,yy&,ww&,hh&)
GOSUB init_ofls
' COOKIE Routine initialisieren
GOSUB
-k2_init_texte
start$="C:\EASE\"
' Startordner (aus dem wird eine Datei oder ein Ordner hinauskopiert)
' Mit diesen - hinauskopierten - Daten wird dann gearbeitet. Es werden
' also keine Daten von Dir gel
scht!
ziel$="H:\NEWS\" ! Zielordner zum herumspielen von KOBASCH
temp$="H:\TEMP\" ! Temporary Ordner (zum zwischenspeichern von
' der Datei bzw. dem Ordner)
dat$="EASE.PRG" ! Datei oder Ordner der benutzt werden soll
' ^^ Bitte anpassen...
GOSUB
'k2_init ! Initialisieren der
&Kobold-Routinen
' Wie schon gesagt! DON'T PANIK!
dia!=TRUE ! Mit KOBOLD-Dialog
al_r$="Return-Code des letzten|KOBOLD_2 Aktion!|-----------------------|"
al$="Erst mal die Datei|in den TEMP Ordner|kopieren! Ohne Dialog!"
ALERT 1,al$,1," OK ",back|
0k2_copy_and_quit(start$,temp$,dat$,FALSE,FALSE,0)
ALERT 1,al_r$+
'k2_err$,1," OK ",back|
ALERT 1,"Mit Dialog und abfragen!",1," OK ",back|
0k2_copy_and_quit(temp$,ziel$,dat$,FALSE,dia!,2)
ALERT 1,al_r$+
'k2_err$,1," OK ",back|
2k2_delete_and_quit(ziel$,dat$,dia!,2)
ALERT 1,al_r$+
'k2_err$,1," OK ",back|
ALERT 1,"Mit Dialog aber|ohne abfragen!",1," OK ",back|
0k2_copy_and_quit(temp$,ziel$,dat$,FALSE,dia!,0)
ALERT 1,al_r$+
'k2_err$,1," OK ",back|
2k2_delete_and_quit(ziel$,dat$,dia!,0)
ALERT 1,al_r$+
'k2_err$,1," OK ",back|
ALERT 1,"Ohne Dialog und|ohne abfragen!",1," OK ",back|
dia!=FALSE
0k2_copy_and_quit(temp$,ziel$,dat$,TRUE,dia!,0)
ALERT 1,al_r$+
'k2_err$,1," OK ",back|
2k2_delete_and_quit(ziel$,dat$,dia!,0)
ALERT 1,al_r$+
'k2_err$,1," OK ",back|
ALERT 1,"Das war's schon!",1," OK ",back|
'k2_exit
' ENDE der DEMONSTRATION
lModule OFLS GFA-Util
Autor:
@ AC3
' MODULE OFLS - check Open FiLeS
' by
*Claus Brod (f
r die KOBOLD-Routinen
berarbeitet 23.10.93 von M.Ssykor)
' Dieses Modul schaut nach, ob das Programm CHK_OFLS.PRG installiert
' ist, bzw. ob der Cookie OFLS vorhanden ist.
' Somit kann man nun
berpr
fen, ob auf einem Laufwerk Dateien ge
ffnet
' sind. Zum Beispiel, wenn man mittels KOBOLD_2 Daten l
schen m
chte.
' Dort kann dann von vorne herein auf
-Modus umgeschaltet werden.
> PROCEDURE init_ofls
LOCAL a$
a$=MKL$(&H202F0004)+MKL$(&H48E77FFE)+MKL$(&H260042A7)
a$=a$+MKL$(&H3F3C0020)+MKL$(&H4E412F40)+MKL$(&H22079)
a$=a$+MKL$(&H5A0)+MKL$(&H670C2218)+MKL$(&H2018B283)+MKL$(&H67064A81)
a$=a$+MKL$(&H66F47000)+MKL$(&H26004E41)+MKL$(&H5C8F2003)
a$=a$+MKL$(&H4CDF7FFE)+MKI$(&H4E75)
cookie_adr%=V:a$
' Assembler Routine, um einen Cookie zu suchen
DEFFN cookie(cookie$)=C:cookie_adr%(L:CVL(cookie$))
RETURN
> FUNCTION chk_ofls$(start$) ! Datei_offen_
berwacher installiert?
SELECT @ofls(ASC(LEFT$(start$,1))-65)
CASE -1
' OFLS.PRG nicht installiert... GEMDOS_MODE
ext$=" GEMDOS_MODE = ("+UPPER$(LEFT$(start$,1))+") "
CASE 1 TO 999999
' offene Dateien auf Laufwerk.. GEMDOS_MODE
ext$=" GEMDOS_MODE = ("+UPPER$(LEFT$(start$,1))+") "
DEFAULT
' OFLS inst und keine offenen Dateien... KOBOLD_MODE
ext$=" "
ENDSELECT
RETURN ext$ ! Teiljob zur
ckliefern
ENDFUNC
> FUNCTION ofls(drv%) ! Gibt Anzahl offener Dateien von LW drv% zur
IF @
'cookie("OFLS")>0
RETURN DPEEK(@
'cookie("OFLS")+6+drv%*2)
ENDIF
' Wenn OFLS.PRG nicht installiert wird -1 geliefert
RETURN -1
ENDFUNC
' --- END-MODULE-OFLS ---
lModule KOBASCH GFA-Util
Autor:
@ AC3
MODULE KOBASCH -
dold-
dnittstelle
' (C) von
' Version: 0.3 24.10.1993
> PROCEDURE k2_init
' Bei Programmstart
adr%=MALLOC(512)
DIM msg&(7)
' Eigene ID
ap_id&=APPL_INIT()
&Kobold 2 ID
k2_id&=APPL_FIND("KOBOLD_2")
' Kobold_2
+Nachrichten
k2_job&=12048
k2_job_no_window&=12049
k2_answer&=12050
k2_konfig&=12051
k2_close&=12054
RETURN
> PROCEDURE k2_exit
' Bei Programmende
' Speicher f
r JOB freigeben!
~MFREE(adr%)
RETURN
> PROCEDURE k2_copy_and_quit(start$,ziel$,dat$,move!,dia!,dialog_level&)
' Eine Datei bzw. Ordner Kopieren oder Verschieben
' ^^^^
' move! = TRUE = Daten verschieben
' move! = FALSE = Daten kopieren
' dia! = TRUE = mit KOBOLD-Dialog
' dia! = FALSE = ohne KOBOLD-Dialog
' JOB generieren
job$="DIALOG_LEVEL = "+STR$(dialog_level&)+" DST_SELECT "+ziel$
job$=job$+" SRC_SELECT "+start$+" SRC_SELECT +"+dat$+" "
IF move!=TRUE
job$=job$+"MOVE IGNORE_WP "
ELSE
job$=job$+"COPY "
ENDIF
' JOB in den Reservierten Speicherbereich kopieren!
GOSUB k2_adresse(job$)
IF dia!=TRUE
msg&(0)=k2_job& !MIT KOBOLD-Dialog
ELSE
msg&(0)=k2_job_no_window& !OHNE KOBOLD-Dialog
ENDIF
GOSUB k2_exec !KOBOLD aktivieren
GOSUB k2_close !KOBOLD schliessen
RETURN
> PROCEDURE k2_delete_and_quit(start$,dat$,dia!,dialog_level&)
' Eine Datei bzw. Ordner l
schen
' ^^^^
' dia! = wie bei k2_copy
' flag! = TRUE = Dialog nach beendung entfernen
' flag! = FALSE = Dialog nach beendung stehen lassen
' JOB generieren
job$="DIALOG_LEVEL = "+STR$(dialog_level&)+" SRC_SELECT "
job$=job$+start$+" SRC_SELECT +"+dat$+" DELETE IGNORE_WP "
' JOB in den Reservierten Speicherbereich kopieren!
GOSUB k2_adresse(job$)
GOSUB k2_dialog(dia!)
GOSUB k2_exec
GOSUB k2_close
RETURN
> PROCEDURE k2_src_select(start$,dia!)
' Quellpfad w
hlen bzw. KOBOLD aktivieren
' dia! = wie bei k2_copy
' flag! = TRUE = Dialog nach beendung entfernen
' flag! = FALSE = Dialog nach beendung stehen lassen
LOCAL ofls%
' JOB generieren
job$="DIALOG_LEVEL = 0"+@chk_ofls$(start$)+"SRC_SELECT "+start$+" "
' JOB in den Reservierten Speicherbereich kopieren!
GOSUB k2_dialog(dia!)
GOSUB k2_adresse(job$)
GOSUB k2_exec
RETURN
> PROCEDURE k2_dst_select(dat$,dia!)
' Zielpfad w
' JOB generieren
job$="DST_SELECT +"+dat$+" "
' JOB in den Reservierten Speicherbereich kopieren!
GOSUB k2_dialog(dia!)
GOSUB k2_adresse(job$)
GOSUB k2_exec
RETURN
> PROCEDURE k2_select(dat$,dia!)
' Datei oder Ordner im Quellpfad selektieren
' JOB generieren
job$="SRC_SELECT +"+dat$+" "
' JOB in den Reservierten Speicherbereich kopieren!
GOSUB k2_dialog(dia!)
GOSUB k2_adresse(job$)
GOSUB k2_exec
RETURN
> PROCEDURE k2_copy(dia!,move!)
' Selectierte von Quellpfad nach Zielpfad kopieren oder verschieben
' JOB generieren
IF move!=TRUE
job$=job$+"MOVE IGNORE_WP "
ELSE
job$=job$+"COPY "
ENDIF
' JOB in den Reservierten Speicherbereich kopieren!
' und MSG 2-4 belegen!
GOSUB k2_adresse(job$)
GOSUB k2_dialog(dia!)
GOSUB k2_exec
RETURN
> PROCEDURE k2_delete(dia!)
' Selectierte im Quellpfad l
schen
' JOB generieren
job$="DIALOG_LEVEL = 0 DELETE IGNORE_WP "
' JOB in den Reservierten Speicherbereich kopieren!
' und MSG 2-4 belegen!
GOSUB k2_dialog(dia!)
GOSUB k2_adresse(job$)
GOSUB k2_exec
RETURN
> PROCEDURE k2_close
' KOBOLD beenden
msg&(0)=k2_close&
msg&(1)=ap_id&
msg&(2)=0
msg&(3)=0
' Abschicken
~APPL_WRITE(k2_id&,16,V:msg&(0))
~EVNT_MESAG(V:msg&(0)) ! Auf Antwort warten
LOOP UNTIL msg&(0)=k2_answer&
status&=msg&(3)
k2_err$=@k2_err$(status&)
RETURN
Nachfolgene Routinen werden von den oben genannten aufgerufen. Sind
also f
r den Anwender uninterressant, d
rfen aber NICHT gel
werden.
> PROCEDURE k2_dialog(flag!) ! Wird ein DIALOG erw
nscht?
' flag!=TRUE = Alle Aktionen mit
&Kobold-Dialog
' flag!=FALSE = " " ohne " "
IF flag!=TRUE
msg&(0)=k2_job&
ELSE
msg&(0)=k2_job_no_window&
ENDIF
RETURN
> PROCEDURE k2_adresse(job$) ! Job in Reservierten Bereich kopieren
CHAR{adr%}=job$
msg&(2)=0 ! Muss 0 sein!
msg&(3)=WORD(SWAP(adr%)) !
'Adresse der Commandline
msg&(4)=WORD(adr%) ! ...im Motoroller-Format
msg&(5)=0 ! Muss 0 sein!
RETURN
> PROCEDURE k2_exec ! Nachricht an KOBOLD abschicken
msg&(1)=ap_id& ! Eigene ID (ist immer in MSG(1))
' Abschicken
~APPL_WRITE(k2_id&,16,V:msg&(0))! Nachricht an's Hauptprogramm senden
~EVNT_MESAG(V:msg&(0)) ! Auf Antwort warten
LOOP UNTIL msg&(0)=k2_answer& ! Bis Antwort=k2_answer&
' RETURN-CODE von
&Kobold
status&=msg&(3)
' 0, wenn OK | <>0 wenn Fehler aufgetreten
' (der Wert ist die Fehlernummer)
' ALERT 1,STR$(status&),1,"OK",b|
zeile&=msg&(4)
' Wenn status& <>0 (also bei einem Fehler) steht hier die Zeile der
' fehlerhaften Stelle in der *.KBJ Datei. Nur bei JOB-Dateien. Nicht
' aber bei Speicherjob's (Da ist es ja eh nur eine Zeile)
k2_err$=@k2_err$(status&)
RETURN
> FUNCTION k2_err$(status&)
' Gibt Fehlermeldung status& als Text zur
SELECT status&
CASE -1
RETURN "FINISHED"
CASE 0
RETURN "OK"
CASE 0
RETURN "ERROR"
CASE 0
RETURN "NO_MEMORY"
CASE 0
RETURN "USER_BREAK"
CASE 0
RETURN "INVALID_POINTER"
CASE 0
RETURN "LOW_BUFFER"
CASE 0
RETURN "WRONG_DRIVE"
CASE 0
RETURN "WRONG_PARAMETER"
CASE 0
RETURN "UNEXPECTED_COMMAND"
CASE 0
RETURN "INVALID_MEMSIZE"
CASE 0
RETURN "NO_SUCH_OBJECT"
CASE 0
RETURN "NO_DRIVE_SELECTED"
CASE 0
RETURN "NO_FOLDER_CREATION"
CASE 0
RETURN "WRITE_PROTECTION"
CASE 0
RETURN "LOW_SPACE"
CASE 0
RETURN "LOW_ROOT"
CASE 0
RETURN "INVALID_PATH"
CASE 0
RETURN "BUFFER_IN_USE"
CASE 0
RETURN "BAD_BPB"
CASE 0
RETURN "BAD_READ"
CASE 0
RETURN "BAD_WRITE"
CASE 0
RETURN "UNKNOWN_COMMAND"
CASE 0
RETURN "NO_WINDOW"
CASE 0
RETURN "TOO_MANY_GOSUBS"
CASE 0
RETURN "TOO_MANY_RETURNS"
CASE 0
RETURN "LABEL_NOT_FOUND"
CASE 0
RETURN "NO_SUCH_FOLDER"
CASE 0
RETURN "REORGENIZED_MEMORY"
CASE 0
RETURN "SELECTION_MODE"
DEFAULT
RETURN "UNKNOWN_ERROR"
ENDSELECT
ENDFUNC
> PROCEDURE k2_init_texte ! Liest die Jobbefehle in ein ARRAY
RESTORE k2_commands
ERASE k2_job$()
DIM k2_job$(54)
FOR i%=0 TO 54
READ a$
k2_job$(i%)=a$
NEXT i%
' Job Kommandos von 0 bis 54
k2_commands:
DATA SRC_SELECT,DST_SELECT,DIALOG_LEVEL,KEEP_FLAGS,IGNORE_WP,ALERT,PAUSE
DATA NEW_FOLDER,CHOOSE,RESET_STATUS,READ_INTO_BUFFER,WRITE_BUFFER,COPY
DATA MOVE,DELETE,QUIT,GOTO,GOSUB,RETURN,PERMANENT,MEMORY,VERIFY,DATE
DATA ARCHIVE_TREATMENT,GEMDOS_MODE,FORMAT_PARAMETER,FORMAT,SOFT_FORMAT
DATA OFF,ON,EVER_OFF,EVER_ON,CONSIDER_PATHS,ON_LEVEL,EXTENSIONS,ARCHIVE
DATA FILE,KEEP_SEQUENCE,RESET_ARCHIVES,OPEN_FOLDERS,CURRENT,KEEP,SET
DATA CLEAR,CLEARED,SI,SE,DI,DE,ST,TT,CLEAR_BUFFER,SOURCE_TREATMENT
DATA DIALOG_WINDOWS,RENAME
RETURN
> PROCEDURE k2_konfig ! noch nicht implementiert
LOCAL a%,a$
msg&(0)=k2_konfig&
msg&(1)=ap_id& ! Applikations-ID des eigenen Programms
msg&(2)=0
msg&(3)=WORD(SWAP(adr%)) !
'Adresse der Commandline
msg&(4)=WORD(adr%) ! ...im Motoroller-Format
msg&(5)=0
' Abschicken
~APPL_WRITE(k2_id&,16,V:msg&(0))
~EVNT_MESAG(V:msg&(0)) ! Auf Antwort warten
LOOP UNTIL msg&(0)=k2_answer&
GOSUB k2_close
min_buffer&=WORD{adr%} ! Eingestellte Speichergrenzen (in KB)
max_buffer&=WORD{adr%+2}
min_admin&=WORD{adr%+4}
max_admin&=WORD{adr%+6}
admin_percent&=WORD{adr%+8} ! Prozentanteil des Verwaltungsspeichers
buffer_in_fast_ram&=WORD{adr%+10} ! Lage der Speicherbereiche
admin_in_fast_ram&=WORD{adr%+12} ! 0 = ST-Ram, 1 = Fast-Ram
admin&=WORD{adr%+14} ! Freier Verwaltungsspeicher zum Zeitpunkt der Abfrage
buffer&=WORD{adr%+16} ! Freier Dateipuffer zum Zeitpunkt der Abfrage
k2_sleeping&=WORD{adr%+18} ! 0 = KOBOLD aktiv, 1 = KOBOLD inaktiv
k2_dialog&=WORD{adr%+20} ! 0 = keine Hauptdialoganzeige, 1 = Hauptformular offen
no_of_files&=WORD{adr%+22} ! Anzahl der im Quellaufwerk selektierten Dateien
no_of_folders&=WORD{adr%+24} ! Anzahl der im Quellaufwerk selektierten Ordner
total_kb&=WORD{adr%+26} ! Auswahlumfang in Kilobytes
source_drive&=WORD{adr%+28} ! Quellaufwerk, -1 = Keins
dest_drive&=WORD{adr%+30} ! Ziellaufwerk, -1 = Keins
a$=SPACE$(4)
BMOVE adr%+33,V:a$,4
a%={V:a$}
a$=BIN$(a%,32)
FOR i%=2 TO 27
IF MID$(a$,i%,1)="0"
MID$(a$,i%,1)=CHR$(i%+95)
ELSE
MID$(a$,i%,1)=CHR$(i%+63)
ENDIF
NEXT i%
gemdos_mode$=MID$(a$,2,26)
' PRINT "MIN-BUFFER: "+STR$(min_buffer&)
' PRINT "
#MAX-BUFFER: "+STR$(max_buffer&)
' PRINT "MIN-ADMIN: "+STR$(min_admin&)
' PRINT "
#MAX-ADMIN: "+STR$(max_admin&)
' PRINT "ADMIN- % : "+STR$(admin_percent&)
' PRINT "BUFFER in FAST RAM: "+STR$(buffer_in_fast_ram&)
' PRINT "ADMIN in FAST RAM: "+STR$(admin_in_fast_ram&)
' PRINT "ADMIN: "+STR$(admin&)
' PRINT "BUFFER: "+STR$(buffer&)
' PRINT "K2 SLEEPING: "+STR$(k2_sleeping&)
' PRINT "K2 DIALOG: "+STR$(k2_dialog&)
' PRINT "NO OF FILES: "+STR$(no_of_files&)
' PRINT "NO OF FOLDERS: "+STR$(no_of_folders&)
' PRINT "TOTAL_KB: "+STR$(total_kb&)
' PRINT "SOURCE-DRIVE: "+STR$(source_drive&)
' PRINT "DEST-DRIVE: "+STR$(dest_drive&)
' PRINT "
-MODE: "+gemdos_mode$
RETURN
' --- END MODULE KOBASCH ---
lProzess-Balken zeichnen GFA-Util
Prozess-Balken
la CAT? Kein Problem! Die nachfolgenden Listings
zeigen, wie es geht. Das zugeh
rige RSC-File ist UUEncoded unter
zu finden.
lAnm:
d Mit der grafischen Darstellung eines lang andauernden Prozesses
(wie z.B. Laden einer Datei oder Errechnen komplexer Funktionen) ist
meist auch mit einer (mehr oder minder) geringer Geschwindigkeits-
einbu
e zu rechnen. Hier solltest Du einen Kompromi
zwischen
Programmschnelligkeit und -information finden.
re es unter Umst
nden m
glich, nur alle 10 Schleifendurchl
die entsprechende Prozess-Routine aufzurufen:
FOR i&=0 to anzahl_schleifendurchlaeufe&
IF i& MOD 10 = 0
prozess()
ENDIF
[...]
@rechnen, laden, etc.
[...]
NEXT i&
12.1
12.2
12.3
lProzess-Balken (nach Pomrehn) GFA-Util
Autor: Ingo Pomrehn @ DU
PROCEDURE prozess_balken(text$,soll%,ist%)
~RSRC_GADDR(0,pbaum&,ptree%) !
'Adresse ermitteln
~FORM_CENTER(ptree%,px%,py%,pw%,ph%) ! Zentrieren
IF prozess_balken!=FALSE AND text$<>" " ! Wird der Balken zum ersten Mal aufgerufen?
~WIND_UPDATE(1)
~WIND_UPDATE(3)
~FORM_DIAL(0,0,0,0,0,px%,py%,pw%,ph%) ! Reservieren
OB_X(ptree%,pbalken&)=0 ! Balken links
OB_W(ptree%,pbalken&)=0 ! und Balken ganz klein
ueberschrift$=SPACE$(30)
text$=LEFT$(text$,28)
MID$(ueberschrift$,15-LEN(text$)/2,LEN(text$))=text$
CHAR{{OB_SPEC(ptree%,ptext&)}}=LEFT$(ueberschrift$,30) !
berschrift
! einsetzen
~OBJC_DRAW(ptree%,0,7,px%,py%,pw%,ph%) ! Box zeichnen
prozess_balken!=TRUE
ELSE
IF ist%<soll% AND prozess_balken!=TRUE ! Balken kann noch wachsen
max%=OB_W(ptree%,pgrund&) ! maximale Gr
breite%=ROUND(max%/soll%*ist%) ! Breite berechnen
IF breite%>0 AND breite%<max%
OB_W(ptree%,pbalken&)=breite% ! Breite setzen
~OBJC_DRAW(ptree%,pbalken&,7,px%,py%,pw%,ph%) ! Rahmen neu zeichnen
ENDIF
ELSE IF ist%=soll% AND prozess_balken!=TRUE ! Balken hat volle Gr
~FORM_DIAL(3,0,0,0,0,px%,py%,pw%,ph%) ! erreicht Dialog wird ab-
~WIND_UPDATE(0) ! gebrochen.
~WIND_UPDATE(2)
prozess_balken!=FALSE
ENDIF
ENDIF
RETURN
lProzess-Balken (nach R
ger) GFA-Util
Autor: Frank R
ger @ OS2
Die Variable balken_w_max& ist die Breite der den Balken umgebenden
Box! Diese mu
t Du irgendwo global definieren oder in der Procedure
abfragen! istwert& und maxwert& sind die aktuellen Werte der Daten,
die der Laufbalken wiederspiegeln soll. Ist maxwert&>0 wird der
Laufbalken berechnet und neu gezeichnet, was -1 und 0 bewirken,
siehst Du ja! SCALE(x&,y&,z&) ist eine selten dokumentierte GFA-
Funktion, die den Wert MUL(x&,DIV(y&,z&)) liefert und f
r Slider-
/Balkenpositionsberechnungen genau das Richtige ist!
PROCEDURE prozess_balken(istwert&,maxwert&)
SELECT maxwert& !wird hier gleich zur Steuerung mi
braucht:-)
CASE -1 !Start
~RSRC_GADDR(0,pbaum&,tree%)
~FORM_CENTER(tree%,x&,y&,w&,h&)
~FORM_DIAL(0,0,0,0,0,x&,y&,w&,h&)
OB_W(tree%,pbalken&)=0
~OBJC_DRAW(tree%,0,8,x&,y&,w&,h&)
CASE 0 !Finish
~FORM_DIAL(3,0,0,0,0,x&,y&,w&,h&)
DEFAULT !Process
OB_W(tree%,pbalken&)=SCALE(balken_w_max&,istwert&,
#MAX(1,maxwert&))
~OBJC_DRAW(tree%,pbalken&,1,x&,y&,w&,h&)
ENDIF
RETURN
lProzess-Balken f
r die FLY-DIALS GFA-Util
noch einmal f
r die FLY-DIALS von Gregor
Duchalski:
PROCEDURE prozess_balken(istwert&,maxwert&)
SELECT maxwert& !wird hier gleich zur Steuerung mi
braucht:-)
CASE -1 ! Start
OB_W(rsc_adr%(tree%),pbalken&)=0 ! Objektbreite auf Null setzen
@rsc_draw(tree%,&X100) ! Dialog sofort zeichnen
CASE 0 ! Ende
@rsc_back(tree%) ! Hintergrund restaurieren
DEFAULT ! Process
OB_W(tree%,pbalken&)=SCALE(balken_w_max&,istwert&,
#MAX(1,maxwert&))
@redraw(tree%,pbalken&) ! Slider neuzeichnen
ENDIF
RETURN
lDiverses GFA-Util
13.1
13.2
13.3
13.4
13.5
13.6
13.7
13.8
13.9
13.10
13.11
13.12
13.13
13.14
13.15
13.16
13.17
13.18
13.19
13.20
13.21
13.22
13.23
13.24
13.25
13.26
13.27
13.28
13.29
13.30
13.31
13.32
13.33
13.34
13.35
13.36
13.37
13.38
13.39
13.40
13.41
13.42
lErmitteln, ob das Programm im Interpreter gestartet wurde GFA-Util
Autor:
0Gregor Duchalski @ DO
' Ermittelt, ob das Programm im Interpreter (FALSE)
' oder compiliert (TRUE) gestartet wurde...
DEFFN comp=BYTE{ADD(BASEPAGE,256)}<>96 ! Compiled?
lErmitteln, ob ein Programm als
#ACC gestartet wurde GFA-Util
Autor:
0Gregor Duchalski @ DO
' Ergibt TRUE, wenn das Programm als
#ACC gestartet wurde...
DEFFN acc=({ADD(BASEPAGE,36)}=0) ! An
#ACC?
uft das Programm unter MultiTOS? GFA-Util
Autor:
0Gregor Duchalski @ DO
' Ergibt TRUE, wenn das Programm unter MultiTOS l
uft...
DEFFN mtos=INT{ADD({ADD(GB,4)},2)}<>1 ! Multitasking TOS?
lGFA-VSYSNC-Befehl ersetzen GFA-Util
Autor:
0Gregor Duchalski @ DO
' Ersetzt den GFA-VSYNC-Befehl...
> PROCEDURE vsync ! Replacement for VSYNC
a%=
%XBIOS(2)+31250
REPEAT
UNTIL BYTE{&HFF8205}*65536+BYTE{&HFF8207}*256+BYTE{&HFF8209}<a%
REPEAT
UNTIL BYTE{&HFF8205}*65536+BYTE{&HFF8207}*256+BYTE{&HFF8209}>a%
RETURN
lSystemfehler-Routinen aus bzw. einschalten GFA-Util
Autor:
0Gregor Duchalski @ DO
' Schaltet die Systemfehler-Routinen aus bzw. ein...
> PROCEDURE alerts_off ! System-Alerts off
INLINE noalert%,8
{noalert%}=&H4CAF0001 ! Maschinencode : movem.w $4(a7),d0
{noalert%+4}=&H44E75 ! rts
IF {BASEPAGE+256}<>noalert% ! Um Alertbox nur einmal auszuschalten
{BASEPAGE+256}=LPEEK(1028) ! alten Wert von CEH merken
SLPOKE 1028,noalert% ! neue Routine installieren
ENDIF
RETURN
> PROCEDURE alerts_on ! System-Alerts on
IF BYTE{BASEPAGE+256}=0 ! Nur anschalten, wenn ausgeschaltet war
SLPOKE 1028,{BASEPAGE+256} ! alte
'Adresse restaurieren
{BASEPAGE+256}=-1 ! Einschaltung kennzeichnen
ENDIF
RETURN
lTastaturpuffer l
schen GFA-Util
Autor:
0Gregor Duchalski @ DO
' Tastatur-Puffer l
schen...
LPOKE
%XBIOS(14,1)+6,0 ! Clear keyboard-puffer
lTOS-Version und -Datum ermitteln GFA-Util
Autor:
0Gregor Duchalski @ DO
' Tos-Version und -Datum ermitteln...
> FUNCTION tos_version$ ! Inquiring TOS-version
a%=LPEEK(&H4F2)
a$=CHR$(ADD(48,PEEK(ADD(a%,2))))
a$=a$+"."+CHR$(ADD(48,PEEK(ADD(a%,4))))+CHR$(ADD(48,PEEK(ADD(a%,3))))
RETURN a$
ENDFUNC
> FUNCTION tos_datum$ ! Inquiring TOS-date
a%=LPEEK(&H4F2)
a$=CHR$(48+SHR(PEEK(a%+&H19),4))
a$=a$+CHR$(48+(PEEK(a%+&H19) AND &HF))
a$=a$+"."+CHR$(48+SHR(PEEK(a%+&H18),4))
a$=a$+CHR$(48+(PEEK(a%+&H18) AND &HF))
a$=a$+"."+CHR$(48+SHR(PEEK(a%+&H1A),4))
a$=a$+CHR$(48+(PEEK(a%+&H1A) AND &HF))
a$=a$+CHR$(48+SHR(PEEK(a%+&H1B),4))
a$=a$+CHR$(48+(PEEK(a%+&H1B) AND &HF))
RETURN a$
ENDFUNC
lBASEPAGE-
'Adresse des aktuellen Prozesses GFA-Util
Autor:
0Gregor Duchalski @ DO
' BASEPAGE-
'Adresse des aktuellen Prozesses...
> FUNCTION act_pd ! BASEPAGE of actual process
$F%
LOCAL a&,os%,a%
' Ermittelt sauber die
'Adresse der Basepage des aktiven Prozesses...
os%=LPEEK(&H4F2) ! os_header
os%={ADD(os%,8)} ! os_beg
a&=INT{ADD(os%,2)} ! os_version
IF a&<&H102 ! TOS 1.00...
a&=SHR(INT{ADD(os%,&H1C)},1)! os_conf
IF a&=4 ! Spanisches TOS...
a%={&H873C}
'
ELSE ! Jedes andere...
a%={&H602C}
'
ENDIF
ELSE ! Ab TOS 1.02...
a%={{ADD(os%,&H28)}} ! ...direkt auslesen
ENDIF
RETURN a%
ENDFUNC
lKalt- oder Warmstart durchf
hren GFA-Util
Autor:
0Gregor Duchalski @ DO
hrt einen Kalt- oder Warmstart aus...
> PROCEDURE kaltstart ! Coldboot
VOID
(&H20,L:0)
SLPOKE &H420,0
SLPOKE &H426,0
SLPOKE &H43A,0
a%=LPEEK(&H4F2)+4
a%=LPEEK(a%)
CALL a%
RETURN
> PROCEDURE warmstart ! Warmboot
VOID
(&H20,L:0)
a%=LPEEK(&H4F2)+4
a%=LPEEK(a%)
CALL a%
RETURN
lKommandozeile (cmd$) GFA-Util
Autor:
0Gregor Duchalski @ DO
' Gibt die an das Programm
bergebene Kommandozeile zur
ck...
' Die Eintr
ge sind durch Spaces getrennt."
> FUNCTION kommando$ ! Get commandline
LOCAL a|
a|=BYTE{ADD(BASEPAGE,128)}
IF a|
RETURN CHAR{ADD(BASEPAGE,129)}
ENDIF
RETURN ""
ENDFUNC
lINLINE 2 STRING GFA-Util
Autor:
0Gregor Duchalski @ DO
' Hilfreich beim Kopieren vom INLINE in einen String.
bergeben wird
' die INLINE-
'Adresse und die L
nge...
> FUNCTION inline$(a%,a&)
LOCAL a$
a$=SPACE$(a&)
BMOVE a%,V:a$,a&
RETURN a$
ENDFUNC
lFarb-Register retten bzw. restaurieren GFA-Util
Autor:
0Gregor Duchalski @ DO
' Rettet die Farb-Register bzw. restauriert sie...
> PROCEDURE save_register ! Saving color-registers
original_reg$=SPACE$(32)
FOR i&=0 TO 15
CARD{V:original_reg$+i&*2}=
%XBIOS(7,i&,-1)
NEXT i&
RETURN
> PROCEDURE restore_register ! Restoring color-registers
VOID
%XBIOS(6,L:V:original_reg$)
RETURN
lBIT-Operation GFA-Util
Autor:
0Gregor Duchalski @ DO
' Setzt das Bit b& in a& in Abh
ngigkeit von c&...
DEFFN bsc(a&,b&,c&)=-MUL((c&=0),BCLR(a&,b&))-MUL((c&<>0),BSET(a&,b&))
lAufruf einer Shell GFA-Util
Autor:
0Gregor Duchalski @ DO
' Aufruf einer Shell (hier: Mupfel)
ber den shell_p-vektor...
> FUNCTION shell_call(a$)
$F%
LOCAL a%,b%
' R
ckgabe: -1 Keine Shell
' 1 MUPFEL
' 0 Andere Shell
a%=LPEEK(&H4F6) ! Shell-Einsprungsdresse
IF a% ! Vorhanden...
' a$=MKL$({SUB(a%,12)})+MKL$({SUB(a%,8)})
' a$="XBRAGMNI" OR a$="XBRAMUPF" ! Mupfel-Identifizierung
a$=a$+CHR$(0) ! Kommando+Nullbyte
b%=C:a%(L:V:a$) ! Kommando
bergeben
ENDIF
RETURN b%
ENDFUNC
lAbfrage der Umschalttasten GFA-Util
Autor:
@ XYZ
' Abfrage der Umschalttasten!
' SICHER _UND_ SCHNELL
VOID GRAF_MKSTATE(mx&,my&,mk&,key&)
' mx& und my& ist die Position der Maus!
' mk& ist der Status der Maustasten!
' key&=
' 1 = Shift-Rechts
' 2 = Shift-Links
' 4 = Control
' 8 = Alternate
' auch Kombinationen sind m
glich: z.B.
' 3 = Linke + Rechte Shifttaste
' 10 = Alternate + Shift-Links
' 15 = Linke + Rechte Shifttaste + Control + Alternate
lCRC-Code berechnen GFA-Util
Autor:
0Christoph Conrad @ AC3
> FUNCTION crc(adr%,anz%)
' CRC-Pruefsummenermittlung nach dem CCITT-Polynom x^16+x^12+x^5+1
' Es wird die 16-Bit CRC-Summe ab adr% ueber anz% Byte gebildet.
RETURN C:
(L:adr%,anz%)
ENDFUNC
lDebugger GFA-Util
Autor:
@ XYZ
TRON debugger ! aufruf des debugger
' Hier das Programm
PROCEDURE debugger
$BIOS(11,-1)=3 ! beide Shift-Tasten
STOP ! Programmstop
ENDIF
$BIOS(11,-1)=4 ! CONTROL (Programmzeilen anzeigen)
LPRINT TRACE$ ! programmzeile auf drucker ausgeben
ENDIF
IF BTST(
$BIOS(11,-1),3) ! ALTERNATE (Variablenabfrage)
PRINT AT(1,1);
INPUT "Bitte gew
nschte DUMP-Variable eingeben : ";eingabe$
LPRINT
DUMP eingabe$ TO "PRN:" ! Variablen auf drucker ausgeben
LPRINT
ENDIF
RETURN
lAdressen von GFA-Prozeduren ermitteln GFA-Util
' Adressen von GFA-Prozeduren ermitteln - 27.2.92 by Stefan Muench
' Parameter
bergabe - 10.06.92 by Gregi Duchalski
' von
0Gregor Duchalski, Baueracker 15a, 4690 Herne 1
' eMail an GREGOR DUCHALSKI Maus DO im MausNet
' last change 26.06.92
' --------------------------------------------------------------
' Mit diesen Routinen k
nnen Sie die Adressen von GFA-Prozeduren
' ermitteln.
' Funktioniert nur in compilierten Programmen. Der Prozedur-Aufruf
am Anfang des Programms stehen.
test1(10,10,200,10)
help.adr%=@find_firstaddress
test1adr%=@find_nextaddress(help.adr%)
' Hier folgt der Aufruf der Prozedur 'test1'
ber den 'C:'-Befehl.
' Die Parameter werden hier in der umgekehrten Reihenfolge
bergeben!
~C:test1adr%(100,200,100,10)
~INP(2)
> PROCEDURE test1(x&,y&,w&,h&)
IF test1!
LINE x&,y&,w&,h&
ENDIF
test!=TRUE
RETURN
> FUNCTION find_firstaddress
$F%
' Sucht die 1.
'Adresse, ab der die Prozeduren aufgerufen werden.
' hier befinden wir uns sicher im Programm:
a%=BASEPAGE
' gesucht wird der 1. JSR xxxxxxxx (4E B9); Schrittweite Word
WHILE WORD{a%}<>&H4EB9
ADD a%,2
WEND
' jetzt den n
chsten JSR suchen
REPEAT
ADD a%,2
UNTIL WORD{a%}=&H4EB9
RETURN a%
ENDFUNC
> FUNCTION find_nextaddress(VAR a%)
' Findet den n
chsten Prozeduraufruf
' zurueck geben wir die Zieladresse des (alten) JSR:
b%={ADD(a%,2)}
' a% soll auf den n
chsten JSR zeigen:
REPEAT
ADD a%,2
UNTIL WORD{a%}=&H4EB9
' Zieladresse des alten JSR
RETURN b%
ENDFUNC
lPrimzahlen errechnen GFA-Util
PRINT "Primzahlen von 1 - 20000"
limit&=20000
t=TIMER
DIM noprime!(20000)
current&=3
WHILE current&*current&<limit&
FOR i&=current&*current& TO limit& STEP current&*2
noprime!(i&)=1
NEXT i&
REPEAT
ADD current&,2
UNTIL NOT noprime!(current&)
FOR i&=3 TO limit& STEP 2
IF noprime!(i&)
INC count&
ENDIF
NEXT i&
PRINT "Zeit: ";(TIMER-t)/200;" Anzahl: ";limit&/2-count&
lUmwandlung: Dezimalzahl in r
mische Zahl GFA-Util
zahl%=1992
GOSUB roemisch(zahl%)
PRINT r$
PROCEDURE roemisch(zahl%)
' wandelt eine Zahl ins r
mische Zahlensystem um
' R
ckgabewert in R$
r$=""
WHILE zahl%>=1000
r$=r$+"M"
zahl%=zahl%-1000
WEND
IF zahl%>=900
r$=r$+"CM"
zahl%=zahl%-900
ENDIF
IF zahl%>=500
r$=r$+"D"
zahl%=zahl%-500
ENDIF
IF zahl%>=400
r$=r$+"CD"
zahl%=zahl%-400
ENDIF
WHILE zahl%>=100
r$=r$+"C"
zahl%=zahl%-100
WEND
IF zahl%>=90
r$=r$+"XC"
zahl%=zahl%-90
ENDIF
IF zahl%>=50
r$=r$+"L"
zahl%=zahl%-50
ENDIF
IF zahl%>=40
r$=r$+"XL"
zahl%=zahl%-40
ENDIF
WHILE zahl%>=10
r$=r$+"X"
zahl%=zahl%-10
WEND
IF zahl%>=9
r$=r$+"IX"
zahl%=zahl%-9
ENDIF
IF zahl%>=5
r$=r$+"V"
zahl%=zahl%-5
ENDIF
IF zahl%>=4
r$=r$+"IV"
zahl%=zahl%-4
ENDIF
WHILE zahl%>=1
r$=r$+"I"
zahl%=zahl%-1
WEND
RETURN
lUmwandlung: Dezimalzahl -> 'Zahlwort' GFA-Util
Autor:
@ XYZ
GOSUB init_ziffernwoerter
zahl=567899512
GOSUB zahlen_in_text(zahl)
PRINT zahlstring$
PROCEDURE zahlen_in_text(zahl)
zahlstring$=""
' Millionenteil umwandeln
teil=zahl DIV 1000000
suffix$=" Million"
IF teil<>0
' Millionen vorhanden, also umwandeln
GOSUB umwandlung(teil)
zahlstring$=umwandlung$
IF teil<>1
' sogar mehrere Millionen, also Mehrzahl
suffix$=suffix$+"en"
ELSE
' sonst aus 'ein' 'eine' machen
zahlstring$=zahlstring$+"e"
ENDIF
zahlstring$=zahlstring$+suffix$+" "
ENDIF
' jetzt den Tausenderteil
zahl=zahl MOD 1000000
teil=zahl DIV 1000
suffix$="tausend"
IF teil<>0
' Tausender vorhanden
GOSUB umwandlung(teil)
zahlstring$=zahlstring$+umwandlung$+suffix$
ENDIF
' jetzt den Rest unter 1000
zahl=zahl MOD 1000
IF zahl<>0
' noch Zahlen umwandeln
GOSUB umwandlung(zahl)
zahlstring$=zahlstring$+umwandlung$
IF (zahl MOD 100)=1
' aus 'einhundertein' mache 'einhunderteins'
zahlstring$=zahlstring$+"s"
ENDIF
ENDIF
IF zahlstring$=""
' Zahl war Null, also String belegen
zahlstring$="null"
ENDIF
RETURN
PROCEDURE umwandlung(teil)
umwandlung$=""
' zuerst die Stellen isolieren
hunderter=teil DIV 100
zehner=(teil MOD 100) DIV 10
einer=teil MOD 10
' Hunderter umwandeln
IF hunderter<>0 THEN
umwandlung$=ziffernwort$(hunderter)+"hundert"
ENDIF
' Jetzt den Rest
IF zehner=1 THEN
' Zahl zwischen 10 und 19 -> Sonderf
umwandlung$=umwandlung$+zahlwort$(einer)
ELSE
' sonst Einer umwandeln
IF einer<>0 THEN
umwandlung$=umwandlung$+ziffernwort$(einer)
ENDIF
IF zehner>=2 THEN
' Falls Zehner vorhanden, auch diese umwandeln
IF einer<>0 THEN
' aus 'zweizwanzig' wird 'zweiUNDzwanzig'
umwandlung$=umwandlung$+"und"
ENDIF
umwandlung$=umwandlung$+zehnerwort$(zehner)
ENDIF
ENDIF
RETURN
> PROCEDURE init_ziffernwoerter
DIM ziffernwort$(9),zahlwort$(9),zehnerwort$(9)
RESTORE ziffernwoerter
FOR i=1 TO 9
READ ziffernwort$(i)
NEXT i
RESTORE zahlwoerter
FOR i=0 TO 9
READ zahlwort$(i)
NEXT i
RESTORE zehnerwoerter
FOR i=2 TO 9
READ zehnerwort$(i)
NEXT i
RETURN
ziffernwoerter:
DATA "ein","zwei","drei","vier","f
DATA "sechs","sieben","acht","neun"
zahlwoerter:
DATA "zehn","elf","zw
lf","dreizehn","vierzehn"
DATA "f
nfzehn","sechzehn","siebzehn","achtzehn","neunzehn"
zehnerwoerter:
DATA "zwanzig","drei
ig","vierzig","f
nfzig"
DATA "sechzig","siebzig","achtzig","neunzig"
lProgrammabl
ufe zeitlich begrenzen GFA-Util
' Programmbeispiel um Programmabl
ufe zeitlich zu begrenzen
' 19.03.1992 Sandro Lucifora f
r TOS
GOSUB init
AFTER sec_anzahl%*200 GOSUB prg_ende ! zeitbegrenzung
PRINT "Schreiben, solange Zeit ist !" ! info schreiben
PRINT CHR$(27);"e" ! cursor einschalten
taste$=INKEY$ ! taste speichern
IF taste$<>"" ! wenn eine taste gedr
PRINT taste$; ! zeichen ausgeben
ENDIF
PROCEDURE init
sec_anzahl%=3 ! zeitbegrenzung in sec
RETURN
PROCEDURE prg_ende
OUT 2,7 ! "pling" ausgeben
ALERT 0," Bis hierhin und | nicht weiter ! ",1,"Ok",wahl|
EDIT
RETURN
lGONG ausgeben GFA-Util
Autor:
@ XYZ
> PROCEDURE gong
LOCAL mx&,my&,mb&,shift&
SOUND 1,15,#486
WAVE 1,1,1,8000,0
REPEAT
~GRAF_MKSTATE(mx&,my&,mb&,shift&)
UNTIL mb&=0
RETURN
lxPling ausgeben GFA-Util
Autor:
@ AC3
Ausgabe eines Pling (wie bei CHR$(7)). Es kann die Anzahl der Plings
angegeben werden. Diese klingen dann aber nicht so gr
lich wie z.B.
PRINT STRING$(CHR$(7),3)...
> PROCEDURE xpling
anz&=3
a$=CHR$(7)+CHR$(254)+CHR$(0)+CHR$(52)+CHR$(1)+CHR$(0)+CHR$(8)
a$=a$+CHR$(16)+CHR$(12)+CHR$(18)
a$=a$+STRING$(anz&,CHR$(13)+CHR$(9)+CHR$(255)+CHR$(8))+CHR$(255)+CHR$(0)
%XBIOS(32,L:V:a$)
RETURN
lZeilenz
hler (nach Ssykor) GFA-Util
Autor:
@ AC3
FUNCTION zeilenzaehler(dat$)
IF @exist(dat$)
ERASE dummy$()
DIM dummy$(50)
OPEN "I",#1,dat$
RECALL #1,dummy$(),50,z%
anz_zeilen%=0
WHILE z%
ADD anz_zeilen%,50
RECALL #1,dummy$(),50,z%
WEND
ADD anz_zeilen%,z%
CLOSE #1
RETURN anz_zeilen%
ELSE
RETURN 0
ENDIF
ENDFUNC
lZeilenz
hler (nach Dunkel) GFA-Util
Autor:
*Ulf Dunkel @ CLP
PROCEDURE file_cntlines_init
' Nur einmal im Programm-Initialisierungsteil aufrufen.
' INLINEs handelt man
ber HELP-Taste, wenn der Cursor
' auf dem Wort INLINE steht. Nach LST-Import mu
ein INLINE
' grunds
tzlich nachgeladen werden!!!
INLINE
RETURN
FUNCTION file_cntlines(file$)
$F%
' DUTY : Pr
ft, ob und wieviele Zeilen eine angegebene Datei enth
' RETURN: -1, wenn nicht ein LF-Zeichen erkannt wurde, ansonsten
' die Anzahl Zeilen (OPTION BASE 0!!!)
' EXTERN file$ !Kompletter Dateiname
' GLOBAL VAR gl_no_ram! !TRUE=Datei nur "in Happen" ladbar
LOCAL nnn% !Dateigr
LOCAL backlines% !R
ckgabewert f
r Anzahl Zeilen
LOCAL lines_maxlen% !Max. erw
nschte Zeilenl
' !normalerweise 32767
LET lines_maxlen%=32768 !+SYM
nnn%=@file_get_size(file$) !Dateigr
e holen
IF nnn%=0
RETURN 0 !Mind 1 Zeile
ELSE IF nnn%>0
IF nnn%>=FRE(0) !Datei pa
t nicht in den Speicher
gl_no_ram!=TRUE
ENDIF
backlines%=@file_sub_cntlines(file$,nnn%,lines_maxlen%)
IF backlines%<0
backlines%=PRED(nnn%\lines_maxlen%)
ENDIF
RETURN backlines%
ENDIF
RETURN -1
ENDFUNC
FUNCTION file_sub_cntlines(file$,file_len%,lines_maxlen%)
$F%
' CNTLINES (c) Werner Buthe/
*Ulf Dunkel, 29.09.94
' ========
' DUTY: CNTLINES z
hlt in einem Speicherbereich die CHR$(10). Sollte der
' Abstand zwischen zwei LF >= 32768 (entspricht 32768 Zeichen+LF),
' wird -1 zur
ckgeben, ansonsten die Anzahl der gefundenen LF
' (=Zeilenanzahl).
' Sinn ist es, zu pr
fen, ob eine Datei Zeilen enth
lt, die > 32767
' Zeichen sind, da sonst die Stringverwaltung von GFA nach einem
' RECALL durcheinander ger
' Die 'b
se' Zeilenl
nge, nach der gefahndet werden soll, ist bei
' Offset 40 ab INLINE-Start patchbar, wobei diese um 1 wegen dem LF
' erh
ht werden sollte. Dieser Wert mu
negativ angegeben werden.
' Parameter f
r C:-Aufruf: Speicheradresse (adr%) und L
nge (len%),
' als Langwort, also mit L:
' RETURN: -1, wenn zu lange Zeilen enthalten sind oder Speicher zu klein,
' sonst Anzahl Zeilen (OPTION BASE 0)
' EXTERN file$ !Kompletter Dateiname
' EXTERN file_len% !Dateigr
e in BYTE
' EXTERN lines_maxlen% !Max. erlaubte Zeilenl
nge,
blicherweise 32767
' LOCAL buff|() !Puffer f
r Dateiteile
' GLOBAL
!CNTLINES-Routine (c) Werner Buthe
LOCAL d0% !R
ckgabewert aus C:-Aufruf
LOCAL lines_count% !Aufaddierte d0%-Werte
LOCAL buff_max%
LOCAL block%
' "B
se" lines_maxlen% plus das LF reinpatchen
' {
+40}=-lines_maxlen%-1
' Pr
fpuffer einrichten
' ---------------------
buff_max%=FRE(0)-&HFFFF !'n bi
chen (64kB) lassen wir frei :-)
IF buff_max%<=0 !Kein Speicher mehr frei
RETURN -1
ENDIF
ADD buff_max%,ODD(buff_max%) !Immer GRADZAHLIGE Speicherbl
cke nutzen!!!
DIM buff|(PRED(buff_max%))
' @
%mouse(busybee&,0)
IF file_len%<buff_max%
BLOAD file$,V:buff|(0)
lines_count%=C:
(L:V:buff|(0),L:file_len%)
ELSE
OPEN "i",#99,file$
DO
block%=MIN(buff_max%,file_len%)
EXIT IF block%<=0
BGET #99,V:buff|(0),block%
d0%=C:
(L:V:buff|(0),L:block%)
ADD lines_count%,d0%
SUB file_len%,block%
IF d0%<0
lines_count%=-1
ENDIF
EXIT IF d0%<0
LOOP
CLOSE #99
ENDIF
ERASE buff|()
' @
%mouse(arrow&,0)
RETURN
#MAX(PRED(lines_count%),-1)
ENDFUNC
lXBRA GFA-Util
Autor: Peter Harder @ NF
Ich habe mir schon die XBRA-Function gebastelt; war einfacher, als
ich dachte. LETEMFLY wird bei mir ausgeh
ngt, wenn ich f
r ein
Programm eine Extension angemeldet habe (z.B. LZH f
r LZH.TTP) und
dann eine entsprechende LZH-Datei starte. Bei einem nochmaligen Start
von LETEMFLY h
ngt es sich nicht wieder ein, weil die Kennung noch im
Cookie ist. Kann man die Zeiger sebst wieder zur
ckbiegen?
IF @xbra(&H88,"LTMF")>0
PRINT "LETEMFLY h
ngt noch in TRAP #2"
PRINT "LETEMFLY wurde aus TRAP #2 ausgeh
ENDIF
FUNCTION xbra(adr%,code$)
adr%=LPEEK(adr%)
IF MKL$({adr%-12})<>"XBRA"
adr%=0
ENDIF
EXIT IF adr%=0
'
' PRINT MKL$({adr%-8}) ! Was h
ngt da eigentlich alles drin?
EXIT IF MKL$({adr%-8})=code$
adr%={adr%-4}
'
LOOP
RETURN adr%
ENDFUNC
lMagiC-Unfreeze GFA-Util
Autor:
*Ulf Dunkel @ CLP
nur mal rasch so eingetippt, ohne Handbuch, ohne Editor, ohne Gew
auf Lauff
higkeit, aber vielleicht hilft's weiter...
PROCEDURE const_magic
' ...
LET sm_m_special&=101 !+SYM
' Screnmgr function codes
' -----------------------
LET smc_freeze&=3 !+SYM
LET smc_unfreeze&=4 !+SYM
LET screnmgr&=1 !+SYM
' ...
RETURN
PROCEDURE gem_init
' ...
ap_id&=APPL_INIT()
' ...
RETURN
FUNCTION unfreeze
$F%
' INTENT: Versuch, Programme unter MagiC "auszufrieren"
' RETURN: FALSE, wenn irgendein Fehler, sonst TRUE
ERASE buf&() !Sicher ist sicher ...
DIM buf&(7)
buf&(0)=sm_m_special&
buf&(1)=ap_id&
buf&(2)=0
buf&(3)=0
buf&(4)=CVI("MA")
buf&(5)=CVI("GX")
buf&(6)=smc_unfreeze&
buf&(7)=child_id
RETURN APPL_WRITE(screnmgr&,16,V:buf&(0))
ENDFUNC
lminfrei GFA-Util
Autor
,Reiner Rosin @ WI2
Ich hab' mir mal eine Routine gebastelt, die innerhalb der
Hauptschleife und an speicherintensiven Stellen aufgerufen wurde.
Diese Routine ermittelt den minimal freien Speicher
ber einen
ngeren Zeitraum und liefert so m.E. aussagekr
ftiger Werte. Bei 10
Betatestern installiert erh
lt man einen recht zuverl
ssige
Informationen
ber den ben
tigten Speicher:
PROC minfrei
LOCAL z
IF minfrei=0
IF EXIST("C:\MINFREI.DAT")
OPEN #13,"I","MINFREI.DAT"
INPUT #13,minfrei
CLOSE #13
ELSE
minfrei=99999999
ENDIF
ENDIF
z=FRE(0)
IF z<minfrei
minfrei=z
OPEN #13,"O","C:\MINFREI.DAT"
PRINT #13,minfrei
CLOSE #13
ENDIF
RETURN
lDMA-Sound GFA-Util
Autor: Joachim Hurst @ B
Jau, hier ein bischen was Code mit den hoffentlich wichtigsten
Ausschnitten, ist von '92, also nicht schreien/flamen. Der
interessanteste Teil d
rfte in den Procs stecken, der Rest ist blo
zum Verst
ndnis.
DIM sample|(100*1024) ! Platz f
r Sample machen
start%=0 ! 1 Byte des Samples
fin%=0 ! letztes Byte des Samples
freq%=1 ! Geschwindigkeitszeiger: 1-4=6.25,12.5,...
anz%=1 ! Wiederholen: 1 mal oder endlos
mix%=1 ! Zeiger auf MIX: -12dB, Mix, nix
bass%=6 ! Default-Wert: Bass
trbl%=10 ! Treble
volli%=20 ! Volumen links
volre%=20 ! Volumen rechts
master%=40 ! Volumen Master
sample!=FALSE ! Flag, ob Sample geladen wurde
OPEN "I",1,datei$
fin%=LOF(#1) ! L
nge des Samples feststellen
CLOSE #1
IF fin%<100000 ! passt's
berhaupt in Speicher
adr%=VARPTR(sample|(0)) ! wenn ja, Startadresse merken
BLOAD pfad$+sam$,adr% ! laden
sample!=TRUE ! und Flag setzen
ELSE ! ansonsten:
ALERT 1," |Sample zu gro
, sorry!| ",1,"Abbruch",dummy%
sample!=FALSE ! Fehler merken
fin%=0 ! keine L
nge markieren
ENDIF
PROCEDURE nosound
DMACONTROL 0
RETURN
PROCEDURE mwi_ansteuern
mask%=&H7FF
x$="&X10" ! ansteuerungsinitialisierung
a$="011" ! Ansteuern: Master Volumen
b$=BIN$(master%,8)
a$=a$+RIGHT$(b$,6) ! nur die rechten 6 bits
MW_OUT mask%,VAL(x$+a$)
a$="101" ! Ansteuern: LCV
b$=BIN$(volli%,8)
a$=a$+RIGHT$(b$,6) ! nur die rechten 5 bits
MW_OUT mask%,VAL(x$+a$)
a$="100" ! Ansteuern: RCV
b$=BIN$(volre%,8)
a$=a$+RIGHT$(b$,6) ! nur die rechten 5 bits
MW_OUT mask%,VAL(x$+a$)
a$="010" ! Ansteuern: TREBLE
b$=BIN$(trbl%,8)
a$=a$+RIGHT$(b$,4) ! nur die rechten 4 bits
MW_OUT mask%,VAL(x$+a$)
a$="001" ! Ansteuern: BASS
b$=BIN$(bass%,8)
a$=a$+RIGHT$(b$,4) ! nur die rechten 4 bits
MW_OUT mask%,VAL(x$+a$)
a$="000" ! Ansteuern: Mixer
b$=BIN$(mix%-1,8)
a$=a$+RIGHT$(b$,2) ! nur die rechten 2 bits
MW_OUT mask%,VAL(x$+a$)
RETURN
PROCEDURE play_dma
LOCAL wdh%,tempo%
wdh%=anz% ! Wiederholungen feststellen,
IF wdh%=2 ! etwa endlos ?
INC wdh% ! dann merken
ENDIF
tempo%=freq%-1
IF play!=TRUE
DMASOUND V:sample|(start%),V:sample|(fin%),tempo%,wdh%
ENDIF
RETURN
lDruck-Routine GFA-Util
Autor:
,Reiner Rosin @ WI2
PROCEDURE hp_print_mit_rand(adresse,breite,hoehe,aufloesung,randx,randy)
' Druckt eine Bitmap auf dem HP-Desk/Laserjet
' Parameter:
' adresse :
'Adresse der zu druckenden Bitmap
' breite : Bitmapbreite in Pixeln
' hoehe : Bitmaph
he in Pixeln
' aufloesung: 2,150 = 150 DPI
' 3,4,75 = 75 DPI
' 5,100 = 100 DPI
' ansonsten: 300 DPI
' randx : linker Rand in Pixeln
' randy : oberer Rand in Pixeln
' V1.0 vom 7.8.91
LOCAL dx,a$,druckbreite
randx=randx DIV 8
dx=(breite+7) DIV 8
SELECT aufloesung
CASE 75,3,4
aufloesung=75
CASE 100,5
aufloesung=100
CASE 150,2
aufloesung=150
DEFAULT
aufloesung=300
ENDSELECT
OPEN #33,"O","PRN:"
2' #UMBRUCH ANFANG!
PRINT #33,CHR$(27);"*t";STR$(aufloesung);"R";CHR$(27);
"*p0X";CHR$(27);"&a0V";CHR$(27);"*r0A";
0' #UMBRUCH ENDE!
a$=CHR$(27)+"*b1W"+CHR$(0)
FOR y=0 TO randy
PRINT #33,a$;
NEXT y
druckbreite=MIN(dx+randx,aufloesung)
a$=STRING$(druckbreite,CHR$(0))
FOR y=0 TO hoehe-1
BMOVE adresse,VARPTR(a$)+randx,druckbreite-randx
ADD adresse,dx
PRINT #33,CHR$(27);"*b";STR$(druckbreite);"W";a$;
NEXT y
' CLOSE #33
RETURN
lUFSL-Init GFA-Util
Autor: Frank R
ger @ OS2
Folgendes irgendwo am Anfang bei der Programminitialisierung
aufrufen! Die Speicheranforderung kann nat
rlich mit anderen
M[x]alloc's zusammengefa
t werden!
PROCEDURE ufsl_init
amount%=112 !Puffer f
r UFSL
ufslbuf%=@my_malloc(amount%,mx_prefalt&,mx_prot_readable&)
IF ufslbuf%<=0
' Fehlermeldung
ENDIF
fretid%=ufslbuf% !Je ein Word f
r die
fretsize%=ADD(fretid%,2) !UFSL-Returns (4)
ufsl_titel%=ADD(fretsize%,2)
CHAR{ufsl_titel%}="SaugUtil: Zeichensatz w
hlen" !UFSL-Titel (36)
ufsl_exmpl%=ADD(ufsl_titel%,36) !Beipielstring f
r UFSL (72)
CHAR{ufsl_exmpl%}="Test Der schnelle braune Fuchs springt
ber den faulen Hund 1234567890"
RETURN
FUNCTION my_malloc(amount%,mode&,prot&)
$F%
IF gemdos_ge_0_19!
RETURN
(mxalloc&,L:amount%,mode& OR -(mint! OR magx2!)*prot&)
ENDIF
RETURN MALLOC(amount%)
ENDFUNC
PROCEDURE font_selector
LOCAL rfontsize&,rfontnr&
LOCAL ufsl_cookie%,font_selinit%,font_selinput%,font_ok!,font_selinput&
LOCAL msg$
font_ok!=-1
rfontnr&=fontnr&
rfontsize&=opt_fontsize&
IF @
+get_cookie("UFSL",ufsl_cookie%)
font_selinit%={ADD(ufsl_cookie%,8)}
font_selinput%={ADD(ufsl_cookie%,12)}
windup(beg_update&)
windup(beg_mctrl&)
~C:font_selinit%()
'
{ADD(ufsl_cookie%,24)}=ufsl_exmpl% !Beispieltext
'
' Nur monospaced Fonts zulassen (ftype=1):
'
2' #UMBRUCH ANFANG!
font_selinput&=C:font_selinput%(vdi_handle&,anzfonts&,
1,L:ufsl_titel%,L:fretid%,L:fretsize%)
0' #UMBRUCH ENDE!
'
windup(end_update&)
windup(end_mctrl&)
SELECT font_selinput&
CASE 1
opt_fontindex&=INT{fretid%}
FOR fontnr&=0 TO PRED(anzfonts&)
EXIT IF fonts&(fontnr&)=opt_fontindex&
NEXT fontnr&
opt_fontsize&=INT{fretsize%}
DEFAULT
CLR font_ok!
SELECT font_selinput&
CASE -1
msg$="*Out of memory!*"
CASE -2
msg$="*Unzul
ssiger Mehrfachaufruf!*"
CASE -3
msg$="*Fontgr
e konnte nicht identifiziert*|*werden!*"
CASE -4
msg$="*Anzahl Fonts mu
er Null sein!*"
ENDSELECT
IF font_selinput&
2' #UMBRUCH ANFANG!
~@my_alert(note&,"Fehler beim UFSL-
Aufruf!|Fehlercode:"+STR$(font_selinput&)+"|entspricht
Fehlermeldung:|"+msg$,1,"Abbruch")
0' #UMBRUCH ENDE!
ENDIF
ENDSELECT
ELSE
'eigener Selektor oder Fehlermeldung ...
ENDIF
IF font_ok! AND (fontnr&<>rfontnr& OR opt_fontsize&<>rfontsize&)
font_berechnen
fenster_anpassen
ENDIF
RETURN
lFalcon-Sound GFA-Util
Autor:
,Reiner Rosin @ WI2
DEFINT "a-z"
' Falcon-Software: Stereo-Signal per DMA in den Speicher,
' und gleichzeitig per DMA wieder heraus
' 10.12.93
INLINE z,20548
%XBIOS(3)
PRINT
%XBIOS(130,2,16*8) ! verst
rkung links
PRINT
%XBIOS(130,3,16*8) ! verst
rkung rechts
PRINT
%XBIOS(130,4,1) ! ???
PRINT
%XBIOS(130,5,0) ! Quelle f
r ADC
PRINT
%XBIOS(130,6,2) ! Kompatibilit
t (entf
PRINT
%XBIOS(131,1,L:z,L:z+16084) ! Aufnahmepuffer
PRINT
%XBIOS(132,1) ! 16 Bit sterero
PRINT
%XBIOS(133,0,0) ! je 1 Kanal Play/Record
PRINT
%XBIOS(135,0,0) ! keine Interrupts
PRINT
%XBIOS(136,12) ! Record enable
PRINT
%XBIOS(139,3,1,0,11,1)
PRINT
%XBIOS(130,4,2)
PRINT
%XBIOS(130,6,3)
PRINT
%XBIOS(131,0,L:z,L:z+16084)
PRINT
%XBIOS(132,1)
PRINT
%XBIOS(133,0,0)
PRINT
%XBIOS(134,0)
PRINT
%XBIOS(135,0,0)
PRINT
%XBIOS(136,15)
PRINT
%XBIOS(139,0,8,0,0,1)
ALERT 1,"OK",1,"OK",ok
GOSUB off
PROCEDURE off
%XBIOS(136,0)
RETURN
llprint$() GFA-Util
Autor: Frank R
ger @ OS2
crlf! -> TRUE -> Zeilenende anh
ngen.
serial! -> TRUE -> Ausgabe auf stdaux, sonst auf stdprn.
ckgabewert: Anzahl der gedruckten Zeichen oder ein negativer
Fehlercode.
ffnen ist nicht n
tig, da die Standardkan
le immer offen sind!
FUNCTION lprint(text$,crlf!,serial!)
$F%
IF crlf!
text$=text$+CHR$(13)+CHR$(10)
ENDIF
RETURN
(64,3+serial!,L:LEN(text$),L:V:text$)
ENDFUNC
ltest_printer_online() (nach R
ger) GFA-Util
Autor: Frank R
ger @ OS2
Ob der Drucker
berhaupt empfangsbereit ist, kann man mit dieser
Funktion testen:
FUNCTION test_printer_online(serial!)
$F%
LOCAL drucker|
REPEAT
IF
(17-2*serial!))=0
2' #UMBRUCH ANFANG!
drucker|=FORM_ALERT(2,"[1][ | Bitte Drucker auf| 'ONLINE'|
schalten!][Abbruch|Drucken]")
0' #UMBRUCH ENDE!
ENDIF
UNTIL
(17-2*serial!)<>0 OR drucker|<2
RETURN drucker|<>1
ENDFUNC
ckgabewert: TRUE -> Drucken m
glich.
ltest_printer_online() (nach Duchalski) GFA-Util
Autor:
0Gregor Duchalski @ DO
' Testet, ob der Drucker eingeschaltet ist (TRUE)...
DEFFN online=
$BIOS(8,0) ! Printer online?
lMODEM 2 GFA-Util
Autor:
-David Reitter @ WI2
Ansprechen von CarrierDetect und DataTerminalReady bei allen aktuell
bekannten seriellen Schnittstellen von Atari-Computern
-David Reitter, 30.04.1994)
Die Routinen ben
tigen t_sst& als Variable f
r die zu benutzende
Schnittstelle. Das Ermitteln und Setzen sollte
ber die
Betriebssystemfunktionen
'Bconmap() (Vorhandensein abfragen!) und
&Rsconf() geschehen, bei Vorhandensein sollten der FSER-Cookie und der
RSFV-Cookie unterst
tzt werden. Wenn sie nicht vorhanden sein, m
dem Benutzer Standardwerte f
r die Schnittstellengeschwindigkeiten
vorgegeben werden. H
here Geschwindigkeiten als 19200 Baud sind nicht
auf Modem1, und nur bei Verwendung von FastSer von
*Franz Sirl oder
'HSMODEM von
/Harun Scheutzow m
glich. Alternativ k
nnen auch eigene
(schnelle) Schnittstellenroutinen installiert werden, was sich aber
in der Regel nicht lohnt.
Das Senden und Empfangen l
uft weiterhin
ber Kanal 1 (oder AUX:),
durch
'Bconmap() werden die Schnittstellendaten entsprechend
umgeleitet.
DataTerminalReady (DTR) steuert haupts
chlich bei den meisten Modems
(und Einstellungen) die Aufrechterhaltung der Leitung. Es ist
meistens zum Auflegen n
tzlich. CarrierDetect ist bei der
Programmierung i.d.R. immer ben
tigt, um auf vorzeitige
Unterbrechungen von Verbindungen korrekt reagieren zu k
nnen.
In GFA-Basic kann man auf diese Signale wie folgt (sauber) zugreifen:
PROCEDURE dtr_aus
LOCAL a%,sr%,s%
INLINE stop_itr%,42
INLINE start_itr%,40
SELECT t_sst&
CASE 0
~
%XBIOS(30,16)
CASE 1
s%=
(32,L:0) ! Schaltet in den Supervisormodus.
sr%=C:stop_itr%()
~
(32,L:s%) ! Schaltet in den Usermodus
a%=BYTE{
%XBIOS(14,0)+&H1D}
BYTE{
%XBIOS(14,0)+&H1D}=BCLR(a%,7)
SPOKE &HFFFF8C85,&H5 ! Chip-Register 5 selektieren
SPOKE &HFFFF8C85,BCLR(a%,7) ! Bit 7 ist entscheident
s%=
(32,L:0) ! Schaltet in den Supervisormodus.
~C:start_itr%(sr%)
~
(32,L:s%) ! Schaltet in den Usermodus
CASE 2
~
%XBIOS(30,16)
CASE 3
s%=
(32,L:0) ! Schaltet in den Supervisormodus.
sr%=C:stop_itr%()
~
(32,L:s%) ! Schaltet in den Usermodus
a%=BYTE{
%XBIOS(14,0)+&H1D}
BYTE{
%XBIOS(14,0)+&H1D}=BCLR(a%,7)
SPOKE &HFFFF8C81,&H5 ! Chip-Register 5 selektieren
SPOKE &HFFFF8C81,&H68 ! Bit 7 ist entscheident
s%=
(32,L:0) ! Schaltet in den Supervisormodus.
~C:start_itr%(sr%)
~
(32,L:s%) ! Schaltet in den Usermodus
ENDSELECT
RETURN
PROCEDURE dtr_an
LOCAL a%,sr%,s%
INLINE stop_itr%,42
INLINE start_itr%,40
SELECT t_sst&
CASE 0
~
%XBIOS(29,239)
CASE 1
s%=
(32,L:0) ! Schaltet in den Supervisormodus.
sr%=C:stop_itr%()
~
(32,L:s%) ! Schaltet in den Usermodus
a%=BYTE{
%XBIOS(14,0)+&H1D}
BYTE{
%XBIOS(14,0)+&H1D}=BSET(a%,7)
SPOKE &HFFFF8C85,&H5 ! Chip-Register 5 selektieren
SPOKE &HFFFF8C85,BSET(a%,7) ! Bit 7 ist entscheident
s%=
(32,L:0) ! Schaltet in den Supervisormodus.
~C:start_itr%(sr%)
~
(32,L:s%) ! Schaltet in den Usermodus
CASE 2
~
%XBIOS(29,239)
CASE 3
s%=
(32,L:0) ! Schaltet in den Supervisormodus.
sr%=C:stop_itr%()
~
(32,L:s%) ! Schaltet in den Usermodus
a%=BYTE{
%XBIOS(14,0)+&H1D}
BYTE{
%XBIOS(14,0)+&H1D}=BSET(a%,7)
SPOKE &HFFFF8C81,&H5 ! Chip-Register 5 selektieren
SPOKE &HFFFF8C81,BSET(a%,7) ! Bit 7 ist entscheident
s%=
(32,L:0) ! Schaltet in den Supervisormodus.
~C:start_itr%(sr%)
~
(32,L:s%) ! Schaltet in den Usermodus
ENDSELECT
RETURN
FUNCTION cdt
LOCAL a%,sr%,s%,t!
INLINE stop_itr%,42
INLINE start_itr%,40
SELECT t_sst&
CASE 0
RETURN NOT BTST(PEEK(&HFFFA01),1)
CASE 1
s%=
(32,L:0) ! Schaltet in den Supervisormodus.
sr%=C:stop_itr%()
~
(32,L:s%) ! Schaltet in den Usermodus
SPOKE &HFFFF8C85,0 ! Chip-Register 0 selektieren
t!=BTST(PEEK(&HFFFF8C85),3) ! Bit 3 sagt alles...
s%=
(32,L:0) ! Schaltet in den Supervisormodus.
~C:start_itr%(sr%)
~
(32,L:s%) ! Schaltet in den Usermodus
RETURN t!
CASE 2
RETURN NOT BTST(PEEK(&HFFFA01),1)
CASE 3
s%=
(32,L:0) ! Schaltet in den Supervisormodus.
sr%=C:stop_itr%()
~
(32,L:s%) ! Schaltet in den Usermodus
SPOKE &HFFFF8C81,0 ! Chip-Register 0 selektieren
t!=BTST(PEEK(&HFFFF8C81),3) ! Bit 3 sagt alles...
s%=
(32,L:0) ! Schaltet in den Supervisormodus.
~C:start_itr%(sr%)
~
(32,L:s%) ! Schaltet in den Usermodus
RETURN t!
ENDSELECT
ENDFUNC
stop_itr% und start_itr% - zum Speichersparen am Besten
in einer Init-Prozedur unterbringen enthalten:
begin 777 STOP_ITR.INL
J8!H * * < $#! 'P' # !3G4
begin 777 START_ITR.INL
H8!H ( * < #(O 1&P4YU \
(Bitte per UUX dekodieren.)
Als Source:
; START_ITR
; Nimmt 1 Word vom Stack und erlaubt damit Interrupts wieder
move.w 4(SP),D1
move.w d1,sr
; STOP_ITR
; Stoppt Interrupts und liefert in D0 den alten Wert (merken !)
; zur
; Darf nur im Supervisormodus aufgerufen werden !
move.w sr,d1
ori.w #$700,sr
move.w d1,d0
Bei R
ckfragen:
ffentliche Gruppen des MausNetz (DF
) oder
-David Reitter Albinistr. 10 55116 Mainz (frank. R
ckumschlag
beilegen)
oder per DF
: david_reitter@wi2.maus.de
lCreate Inline Assembler File GFA-Util
Autor: Michael Urrey @ ??, Dieter Wiesemann @ ??
ALERT 0,"Create Inline Assembler File | f
r GFA Basic 3.0x |
by Dieter Wiesemann und | Michael Urrey",1,"SUPER|Ende",dummy%
IF dummy%=2
END
ENDIF
' assemblerprogramm laden und als inline file saven
'
FILESELECT "\*.*","",file$
ext$=UPPER$(RIGHT$(file$,3))
EXIT IF ext$="PRG" OR ext$="TOS"
ALERT 1," Ich mag nur PRG | oder TOS-Files ",1," OK ",but%
LOOP
' den unnoetigen programm header wegwerfen
OPEN "I",#1,file$
inline$=RIGHT$(INPUT$(LOF(#1),#1),LOF(#1)-28)
laenge%=LOF(#1)-28
CLOSE #1
inl_file$=LEFT$(file$,LEN(file$)-3)+"INL"
BSAVE inl_file$,VARPTR(inline$),LEN(inline$)
' list file erzeugen zum einbinden ins Programm
count%=LEN(file$)
EXIT IF MID$(file$,count%,1)="\"
DEC count%
LOOP
' den Filenamen suchen und den Pfad fuers LST file erzeugen
test$=RIGHT$(file$,LEN(file$)-count%)
lstfile$=LEFT$(test$,LEN(test$)-3)+"LST"
lstfile$=LEFT$(file$,LEN(file$)-LEN(lstfile$))+lstfile$
nam$=LEFT$(test$,LEN(test$)-4)
PRINT file$ ! auf der screen soll auch was zu sehen sein
PRINT lstfile$
PRINT nam$
' und nun das listing zum mergen
dummy$=CHR$(13)+CHR$(10)
laenge$=STR$(laenge%)
lst0$="'Assembler Routine "+nam$+" einbinden"+dummy$
lst1$=nam$+"$=SPACE$("+laenge$+")"+dummy$
lst2$=nam$+"%=VARPTR("+nam$+"$)"+dummy$
lst3$="INLINE "+nam$+"%,"+laenge$+dummy$
lst$=lst0$+lst1$+lst2$+lst3$
PRINT lst$
BSAVE lstfile$,VARPTR(lst$),LEN(lst$)
ALERT 2," | |weitermachen ",1," klaa| n
",dummy%
EXIT IF dummy%=2
CLS
lAuslesen des $m-Wertes eines Compilates GFA-Util
Autor: J
rgen Meyer @ HH2
Hier mal ein (uralter) Source, den ich mal zum Auslesen des $m-Wertes
aus Compilaten geschrieben habe. Klappt mit allen Compilaten ab V3.02
bis zur V3.6 TT.
Wer Lust hat, kann ja mal ein nettes
#GEM-Programm zum Patchen von $m-
Werten schreiben :-)
lAnmerkung:
d Ich (Peter) habe tats
chlich ein kleines, auf dieser
Routine basierendes Progr
mmchen zum Patchen des $m-Wertes
geschrieben (lat
rnich voll in
#GEM eingebunden und etwas schneller ;-
). Falls Ihr Interesse habt, so lege ich es mal in eine Maus.
' Erfrage $M-Wert eines V3.50 Compilates (wr) 27.02.1991
$M65536
PRINT AT(2,2);"Compilat w
hlen !"
FILESELECT CHR$(
(&H19)+65)+":"+DIR$(0)+"\*.*","",file$
IF EXIST(file$)=FALSE
CLS
END
ENDIF
CLR mem%,found!
OPEN "I",#1,file$
le%=LOF(#1)
IF MALLOC(-1)<le%
ALERT 1,"Nicht genug Speicher !",1,"ABBRUCH",i%
mem%=MALLOC(le%)
BGET #1,mem%,le%
ENDIF
CLOSE #1
IF mem%<>0
FOR i%=mem% TO ADD(mem%,SUB(le%,2)) STEP 2
IF {i%}=&H40005C8F AND {ADD(i%,4)}=&H72FE0281
found!=TRUE
ENDIF
EXIT IF found!=TRUE
NEXT i%
m%={ADD(i%,8)}
IF found!=TRUE AND m%<>-1
ALERT 1,"$M - Wert des Compilats :| |"+STR$(m%)+" ($"+HEX$(m%,8)+")",1," OK",i%
ELSE
ALERT 1,"Das angew
hlte Compilat|"+file$+"|enth
lt keine $M-Anweisung!",1,"ABBRUCH",i%
ENDIF
~MFREE(mem%)
ENDIF
lMultitask-APP??? GFA-Util
Autor: Frank R
ger @ OS2
eFrage:
d Wie erkenne ich, ob mein Programm unter einen MagiC/MultiTOS
gestartet wurde? Unter MagiC ist noch wichtig, ob es als Single-
Task gestartet wurde?
ap_count&=INT{ADD({ADD(GB,4)},2)} !Anzahl der m
glichen Prozesse
ap_version&=INT{{ADD(GB,4)}} !
-Version
mint!=@
+get_cookie("MiNT",mint_version%) !MiNT?
mtos!=ap_count&<>1 AND ap_version&>=&H400 AND mint!
magx!=@
+get_cookie("MagX",magx_cookie%)
magx_version%=INT{{magx_cookie%+8}+48}
' z.B.
' magx2!=magx_version%>=&H200
magx_single!=magx! AND ap_count&=1
lSPLines GFA-Util
Autor: Ingo Dehne @ W
' SPLINE.LST
PROCEDURE init
anz_max&=100
schritt_max&=100
DIM a(anz_max&),b(anz_max&),c(anz_max&),d(anz_max&)
DIM x_stuetz(anz_max&),y_stuetz(anz_max&)
DIM x_spline(anz_max&*schritt_max&),y_spline(anz_max&*schritt_max&)
RETURN
PROCEDURE main
PRINT CHR$(27);"p" ! reverse Schrift einschalten
REPEAT
CLS
PRINT AT(1,1);SPACE$(80);
PRINT AT(1,1);" linke Maustaste: St
tzstellen setzen,";
PRINT " rechte Maustaste: Interpolation starten."
'
anz&=-1
REPEAT
MOUSE mx&,my&,mk&
'
IF mk&=1 AND my&>16
PCIRCLE mx&,my&,2
INC anz&
x_stuetz(anz&)=mx&
y_stuetz(anz&)=my&
ATEXT mx&,my&+6,1,STR$(anz&)
REPEAT
UNTIL MOUSEK=0
ENDIF
'
UNTIL anz&=anz_max& OR mk&=2
'
IF anz&<2
ALERT 1,"Zuwenig Punkte|angegeben!",1,"Weiter",rueck&
ELSE
ALERT 2,"Ersten|mit letztem|Punkt verbinden ?",1,"Ja|Nein",rueck&
'
IF rueck&=1 ! wenn geschlossene Kurve
verbinden!=TRUE ! Flag setzen
INC anz& ! Anzahl der Stuetzpunkte
x_stuetz(anz&)=x_stuetz(0) ! erhoehen und Koordinaten
y_stuetz(anz&)=y_stuetz(0) ! des letzten Punktes belegen
ELSE
verbinden!=FALSE
ENDIF
'
schritte&=10 ! mindestens 1, h
chstens schritt_max&
'
2' #UMBRUCH ANFANG!
ebenen_splines(anz&,schritte&,verbinden!,x_stuetz(),y_stuetz(),
x_spline(),y_spline())
0' #UMBRUCH ENDE!
'
' geschafft, jetzt auf dem Bildschirm ausgeben
'
ACLIP 1,0,0,639,399
anz_spl&=anz&*schritte&
'
FOR i&=1 TO anz_spl&
2' #UMBRUCH ANFANG!
ALINE x_spline(PRED(i&)),y_spline(PRED(i&)),x_spline(i&),
y_spline(i&),1,&HFFFF,0
0' #UMBRUCH ENDE!
NEXT i&
'
ACLIP 0,0,0,639,399
'
PRINT AT(1,1);SPACE$(80);
PRINT AT(1,1);" Weiter mit beliebiger Taste, Abbruch mit <Esc>"
'
REPEAT
UNTIL INKEY$="" ! Tastaturpuffer loeschen
taste&=INP(2)
ENDIF
'
UNTIL taste&=27 ! Abbruch, wenn <Esc> gedrueckt
PRINT CHR$(27);"q" ! reverse Schrift ausschalten
RETURN
2' #UMBRUCH ANFANG!
PROCEDURE ebenen_splines(n&,m&,verbind!,VAR
x_stuetz(),y_stuetz(),x_spline(),y_spline())
0' #UMBRUCH ENDE!
LOCAL i&,j&,k&
IF verbind! !\
sx=(x_stuetz(1)-x_stuetz(n&-1))*0.5 ! \
sy=(y_stuetz(1)-y_stuetz(n&-1))*0.5 ! \ Ableitung
ELSE ! > an den Stuetzpunkten
sx=0 ! / 0 und n gleichsetzen
sy=0 ! /
ENDIF !/
kub_splines(n&,sx,sx,x_stuetz(),b(),c(),d())
h=1/m&
k&=0
FOR i&=1 TO n&
t=-1
FOR j&=0 TO m&-1
x_spline(k&)=((d(i&)*t+c(i&))*t+b(i&))*t+x_stuetz(i&)
ADD t,h
INC k&
NEXT j&
NEXT i&
x_spline(k&)=x_stuetz(n&)
kub_splines(n&,sy,sy,y_stuetz(),b(),c(),d())
k&=0
FOR i&=1 TO n&
t=-1
FOR j&=0 TO m&-1
y_spline(k&)=((d(i&)*t+c(i&))*t+b(i&))*t+y_stuetz(i&)
ADD t,h
INC k&
NEXT j&
NEXT i&
y_spline(k&)=y_stuetz(n&)
RETURN
PROCEDURE kub_splines(n&,s0,sn,VAR a(),b(),c(),d())
LOCAL n1&,i&,r,dr,s
n1&=n&-1
b(0)=(a(1)-a(0)-s0)*6
FOR i&=1 TO n1&
b(i&)=(a(SUCC(i&))-a(i&)*2+a(PRED(i&)))*3
NEXT i&
b(n&)=(a(n1&)-a(n&)+sn)*6
c(0)=b(0)*0.5
b(1)=b(1)-b(0)*0.25
r=1.75
dr=1/r
c(1)=b(1)/1.75
FOR i&=2 TO n1&
s=-0.5*dr
ADD b(i&),b(PRED(i&))*s
r=s*0.5+2
dr=1/r
c(i&)=b(i&)*dr
NEXT i&
s=-dr
b(n&)=b(n&)+b(n1&)*s
r=s*0.5+2
c(n&)=b(n&)/r
FOR i&=n1& TO 1 STEP -1
IF b(i&)=0
temp=1.0E-09
ELSE
temp=b(i&)
ENDIF
MUL c(i&),1-c(SUCC(i&))/temp*0.5
NEXT i&
IF b(0)=0
temp=1.0E-09
ELSE
temp=b(0)
ENDIF
c(0)=c(0)*(1-c(1)/temp)
FOR i&=1 TO n&
i_pred&=PRED(i&)
b(i&)=a(i&)-a(i_pred&)+(c(i&)*2+c(i_pred&))/6
d(i&)=(c(i&)-c(i_pred&))/6
NEXT i&
FOR i&=1 TO n&
MUL c(i&),0.5
NEXT i&
RETURN
lTOS-Cursor GFA-Util
Autor: Peter Harder @ NF
In den alten Programmen befinden sich h
ufig noch diverse GFA-
Befehle, die den TOS-Courser nutzen. Sp
testens unter MagicMac machen
diese Programme so viel
rger, da
etwas passieren mu
Mit den untenstehenden Routinen k
nnen schnell die GFA-Befehle PRINT
AT, PRINT, LOCATE, HTAB, VTAB, CRSCOL, CRSLIN und TAB in alten
Programmbest
nden ersetzt werden, da diese Befehle alle den TOS-
Courser nutzen. Stattdessen wird im Programm ein eigener Courser
mitgeschleift, der durch die beiden globalen Variablen
hhtab_x&
h und
hvtab_y&
d repr
sentiert wird.
Die Routinen sollten grunds
tzlich gemeinsam in ein Programm
eingesetzt werden, da die beiden Courser-Variablen teilweise in
vorbelegter Form erwartet werden.
Kleiner Nebeneffekt: Da der TEXT-Befehl unter
$NVDI deutlich schneller
ist, als der PRINT-Befehl, ergibt sich auch eine deutliche
Beschleunigung der alten Programme.
PROCEDURE print_at(x&,y&,text$)
TEXT x&*8-8,y&*16-1,text$
LET htab_x&=x&+LEN(text$)
LET vtab_y&=y&
RETURN
PROCEDURE print(text$)
TEXT htab_x&*8-8,vtab_y&*16-1,text$
ADD htab_x&,LEN(text$)
RETURN
PROCEDURE cr_lf
' Zeilenvorschub nach @print() und @print_at()
INC vtab_y&
LET htab_x&=1
RETURN
PROCEDURE locate(x&,y&)
LET htab_x&=x&
LET vtab_y&=y&
RETURN
PROCEDURE htab(x&)
LET htab_x&=x&
RETURN
PROCEDURE vtab(y&)
LET vtab_y&=y&
RETURN
FUNCTION crscol
$F%
RETURN htab_x&
ENDFUNC
FUNCTION crslin
$F%
RETURN vtab_y&
ENDFUNC
FUNCTION rspace$(strng$,laenge&)
' Formatiert einen String auf die angegebene L
nge, indem der String
' rechts abgeschnitten wird oder indem Leerzeichen angeh
ngt werden.
' Macht u.a. den nicht
#GEM-konformen GFA-Befehl TAB()
berfl
ssig.
IF laenge&=>0
strng$=LEFT$(strng$,laenge&)
RETURN strng$+SPACE$(laenge&-LEN(strng$))
ELSE
RETURN ""
ENDIF
ENDFUNC
lInlines GFA-Util
14.1
14.2
14.3
14.4
14.5
14.6
14.7
14.8
lob_spec% GFA-Util
Autor:
@ XYZ
table
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 OB_SPEC.INL
M("\ !$CG?_X@0#(O $#"_ 8T<$P* &(&@ #+ \ !AF!B!H 3@0+ \ !1Gz
M#+ \ !EG!K \ !MF%" (X(#@." 0?H"JA" 0B@ 6 @L#P &F<:L#P '&<4y
<L#P (&<.L#P 'V8&(&@ "& "(% @"$S??_Y.=2@ x
lcookie% GFA-Util
Autor:
@ XYZ
table
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 COOKIE.INL
M("\ !$CG?_XF $*G/SP ($Y!+T B!Y %H&<,(A@&+*#9P9*@6;T< Fk
- $Y!7(\@ TS??_Y.=3P j
lcrc_code% GFA-Util
Autor:
0Christoph Conrad @ AC3
table
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 CRC_CODE.INL
H(&\ !#(O A"0$)#8!06&.%+MT!T!^-(9 0*0! A4<K_]E')_^I.=0 9h
lsanduhr% GFA-Util
Autor:
@ AC3
table
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 SANDUHR.INL
M $ 0 ! 0, !P /@!_ /^!_\/_X__P__Q__#_X'_ /X ? X # P %f
M Z &4 PH&"0H(C0]"_[$?T)_@7\ O@!< "@ , 0 ! $ ! " O_^e
M__[__O_^__[__O_^__[__O_^__Z @ ( "__Z K@ZQ'["_L'^PO[$d
M?K@Z@ +__H " ! $ 0 $ P #@ ? #^ ?\#_X?_S____S_^'_Pc
M/^ ?P ^ !P # # * !< +X!?P)_A']+__0_*"(<) PH!E #H % , $ b
M 0 ! ?_X?_!_\'_P?_!_\'_P?_!_\'_P?_!_\'_P?_#_^ __A/D%_0a
M7]!?T$^01Q!"$$402)!04%!04%!/D/_X 0 ! $ !__A_\'_P?_!_z
M\'_P?_!_\'_P?_!_\'_P?_!_\/_X #_^$^07=!?T%_03Y!'$$(011!(D%!0y
M4%!24$^0__@ ! $ 0 '_^'_P?_!_\'_P?_!_\'_P?_!_\'_P?_!_x
M\'_P__@ /_X3Y!<T%_07]!/D$<00A!%$$B04%!04%-03Y#_^ $ 0 !w
M ?_X?_!_\'_P?_!_\'_P?_!_\'_P?_!_\'_P?_#_^ __A/D%C07]!?v
MT$^01Q!"$$402)!04%)04U!/D/_X 0 ! $ !__A_\'_P?_!_\'_Pu
M?_!_\'_P?_!_\'_P?_!_\/_X #_^$^04-!?T%_03Y!'$$(011!(D%!04E!7t
M4$^0__@ ! $ 0 '_^'_P?_!_\'_P?_!_\'_P?_!_\'_P?_!_\'_Ps
M__@ /_X3Y!04%_07]!/D$<00A!%$$B04%!24%]03Y#_^ $ 0 ! r
M ?_X?_!_\'_P?_!_\'_P?_!_\'_P?_!_\'_P?_#_^ __A/D%!07=!?T$^0q
M1Q!"$$402)!04%907U!/D/_X 0 ! $ !__A_\'_P?_!_\'_P?_!_p
M\'_P?_!_\'_P?_!_\/_X #_^$^04%!<T%_03Y!'$$(011!(D%)05E!?4$^0o
M__@ ! $ 0 '_^'_P?_!_\'_P?_!_\'_P?_!_\'_P?_!_\'_P__@ n
M /_X3Y!04%C07]!/D$<00A!%$$B04E!64%_03Y#_^ $ 0 ! ?_Xm
M?_!_\'_P?_!_\'_P?_!_\'_P?_!_\'_P?_#_^ __A/D%!04-!?T$^01Q!"l
M$$402)!24%=07]!/D/_X 0 ! $ !__A_\'_P?_!_\'_P?_!_\'_Pk
M?_!_\'_P?_!_\/_X #_^$^04%!04%_03Y!'$$(011!*D%)05U!?T$^0__@ j
M ! $ 0 '_^'_P?_!_\'_P?_!_\'_P?_!_\'_P?_!_\'_P__@ /_Xi
M3Y!04%!07=!/D$<00A!%$$B04E!?T%_03Y#_^ $ 0 ! ?_X?_!_h
M\'_P?_!_\'_P?_!_\'_P?_!_\'_P?_#_^ __A/D%!04%!9T$^01Q!"$$40g
M2)!64%_07]!/D/_X 0 ! $ !__A_\'_P?_!_\'_P?_!_\'_P?_!_f
M\'_P?_!_\/_X #_^$^04%!04%C03Y!'$$(011!(D%=07]!?T$^0__@ !e
M $ 0 '_^'_P?_!_\'_P?_!_\'_P?_!_\'_P?_!_\'_P__@ /_X3Y!0d
M4%!04-!/D$<00A!%$$B07U!?T%_03Y#_^ $ 0 ! ?_X?_!_\'_Pc
M?_!_\'_P?_!_\'_P?_!_\'_P?_#_^ __A/D%!04%!04$^01Q!"$$402I!?b
M4%_07]!/D/_X 0 ! $ !__A_\'_P?_!_\'_P?_!_\'_P?_!_\'_Pa
M?_!_\/_X #_^$^04%!04%!039!'$$(011!*D%_07]!?T$^0__@ ! $ z
M 0 '_^'_P?_!_\'_P?_!_\'_P?_!_\'_P?_!_\'_P__@ /_X3Y!04%!0y
M4%!)D$<00A!%$$Z07]!?T%_03Y#_^ $ 0 ! ?_X?_!_\'_P?_!_x
M\'_P?_!_\'_P?_!_\'_P?_#_^ __A/D%!04%!04$B01Q!"$$403Y!?T%_0w
M7]!/D/_X 0 ! $ !__A_\'_P?_!_\'_P?_!_\'_P?_!_\'_P?_!_v
E\/_X #_^$^04%!04%!02)!%$$(01Q!/D%_07]!?T$^0__@ /!_u
lbusymouse% GFA-Util
Autor:
@ AC3
table
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 BUSYMAUS.INL
M ! 0_P/_Q__G_^_____________________W_^?_X__ _P 'z
MX!CX(/P@_$#^0/Y _G\"?P)_!C\$/PP?& ?@ $ !#_ __'_^y
M?_[_____________________?_Y__C_\#_ ?@&!@'" \<#Y\?G_^?_Y^x
M/GP./ 0X!!@8!^ 0 $/\#_\?_Y__O__________________w
M__]__G_^/_P/\ !^ 8&# ,.!Q\/GY^?_Y__GY^?#XX'# ,&!@'X v
M ! 0_P/_Q__G_^_____________________W_^?_X__ _P 'X!@8u
M. 0\!'P.?CY__G_^?'YP/B \(!P8& ?@ $ !#_ __'_^?_[_t
M____________________?_Y__C_\#_ ?@'Q@_##\$?P9_ G\"0/Y _D#^s
M(/P@_!CX!^ 0 $/\#_\?_Y__O____________________]_r
M_G_^/_P/\ !^ ?^#_D/\1?PD>"08)!@D'B0_HC_"?\'_@'X !q
M 0_P/_Q__G_^_____________________W_^?_X__ _P 'X!_X/_POp
M]$?B0\)!@D&"0\)'XB_T/_P?^ ?@ $ !#_ __'_^?_[_____o
M________________?_Y__C_\#_ ?@'_@G_"/\0_I!XD&"08)'@E_"/\0_n
'Y!_X!^ /__m
lboyer_adr% GFA-Util
Autor:
@ XYZ
table
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 BM.INL
M2.]__O_(+&\ %C(O !!G #^LGP FT ,J]_ !G$B!O Q"0%-!$! 0z
M]@ 4<G_^"!O !(^+P 0,#P _Q#'4<C__"!O S0QR)O !)\ $) $""^,0 y
M9@03A@ 4D:^1F+L(&\ !"PO AG ">0?!P_R1O Q%\G#_)F\ $G( $! 2x
M$KW\ &<$$#8 +( 9QH2,P :Q#0P9R!:MYP $SO?_[_R$YU1$%@[#H'w
M544H2"I*$"02);W\ &<$$#8 +( 9P9!Z !8*Y1S?_D( Q,[W_^_\A.v
M=2)O P@;P $*$C9[P (%A&]_ !F'KG(;1"V&&;X( A3@$SO?_[_R$YUu
M< !,[W_^_\A.=4)!QGP _Q8V, "YR&WH$A@2-A M@%F\B (4X!,[W_^_\A.t
!=0!,s
lctab% GFA-Util
Autor:
@ XYZ
table
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 CTAB.INL
M $" P0%!@<("0H+# T.#Q 1$A,4%187&!D:&QP='A\@(2(C)"4F)R@I*BLLq
M+2XO,#$R,S0U-C<X.3H[/#T^/T!!0D-$149'2$E*2TQ-3D]045)35%565UA9p
M6EM<75Y?8$%"0T1%1D=(24I+3$U.3U!14E-455976%E:>WQ]?G^ FH*#CH6&o
MAXB)BHN,C8Z/D)&2DYF5EI>8F9J;G)V>GZ"AHJ.DI::GJ*FJJZRMKJ^PL;*Sn
MM+6VM[BYNKN\O;Z_P,'"P\3%QL?(R<K+S,W.S]#1TM/4U=;7V-G:V]S=WM_@m
?X>+CY.7FY^CIZNOL[>[O\/'R\_3U]O?X^?K[_/W^_]/4l
lcntlines% GFA-Util
Autor:
*Ulf Dunkel @ CLP
lCNTLINES als INLINE:
table
!"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
begin 644 CNTLINES.INL
M(&\ !"(O AP %.!) %(0B8(#!@ "F<*4<G_^%'*__1.=5* EHBVO/__@OYKz
)!"8(8.9P_TYUy
lHEX-Dump von CNTLINES.INL:
0000: 206F 0004 222F 0008 7000 5381 2401 4842
0010: 2608 0C18 000A 670A 51C9 FFF8 51CA FFF4
0020: 4E75 5280 9688 B6BC FFFF 82FE 6B04 2608
0030: 60E6 70FF 4E75
lAndere UUE's GFA-Util
15.1
15.2
lverybusy.uue GFA-Util
Autor:
,Ulli Gruszka @ DO,
@ AC3
begin 644 VERYBUSY.LZH
M)SLM;&@U+6L "P ;(/F'B $59%4EE"55-97$)54UDN2%)$@>0 7E-Vz
ML34&,2*R-)IL:S97:FT6<FX@1,!.Y)O)1)_:8!"&VS!G1O_P<^B:>6<+DWX4y
MI N6<5^@N=;24P?4D2FH/M>-Q!]W2H[:/\?B7>/RUL://:J>D-T)F@7W4JQWx
M2:E/.T$N> Q3%G$9$"=>+6QH-2VO"P )"X &R#YAX@ !%615)90E5365Q"w
M55-9+E)30U<V",!\'>V;379[V226!0MEN "6V6SZ6VVVVVA<;9:4K9* --M@v
MM00#9#4@6:E2V6LM.0W&D^M#_0XV<5SC.>>4N3+EVX<*J(\YQ"IESGGD5<N5u
M7F W*JN6@Y6!I9]YY]]+[;][C8V_FGJU>W"&PX-D=L[&SW+W/X&KS^$CUNU:t
MBDVI"$H8VMC:W&XL=LYEG,DF26)%H1] 1/6/F1!D)A^X22(L)FB8L.>0(MD5s
M)W1DDB+4@T1HI QN+(O /DP\L2+B1@3QTE(N I5<2.#RO3'M0BK"$C:T/58$r
MM81@6.&HVX3H<8\8:/\$*74CK31^\)&Q(\:3#$PY:W%6KDT7AS5O^<M;L5:'q
MQ$>6M\<3$$QN#0[,*#F@\XE6A\11EH>.-0^;+0\>:/:E7[(T?L"K^0-'W 69p
MJ1Y$T?[8-=2/SAH\(F*B1\4K'Q,L#+4CXLT=P#A4CXPT?2!>BI'QIH^M #$Mo
MG-'^ 27B1Y(+*6>#9O3C?F'G'*V;XGNRV;RY),C8H\88W>KB2AA_Y2CVBM;Qn
MV)+;/*FCX\ML\L:/5EMG:FCO"VSH&C]>6V=L:/MRVSR1H_?%MGF#9%ZL%.Q)m
MD CT898\A@N^5!WCA7FE7?'<(KOFU:?CVA7?.&CTY7?.FCZ,KOGC1[<KOGS1l
M^S*[Z T?YQ7?0FC_C*[Z)6.RC2X5\>:/0EPKY T?-%PKS!H]F7"OSQ.=)D38k
M)XX+.5Q,BK9NRZXMF]&:A_CD81(]*3GR9+!H>.#>*"A^@-0_V"T/ZPU#P2V_j
M^M5CR$F6W^D-'IBV_Y(T?IRV_\\:.B6W]N'RBT^"IVP$8\%/3*J>0]\53^N-i
M0^[*IZ<T?\)5/2JQY'#%4^:(X)F36SR)* *WJ%:WD9\M;Y0U#](6M\J:.[+6h
M^6-'N2UOES1_BEL?]>:/]<
"MC]2:/^PN)_,*Q^<9EQ/]":/2EQ/]$:/H2XG^Cg
M-'>EQ/](:/=%Q/YDT>[#.G$O'-'O"3L2.0E41T:V?&!\#:XE6K;/BHPML_L%f
M:'Q4Z E2/FS1^B+CGSAH]@6W_V)H_6AE#4CYTT?;!]?JD?/&C_5+<OGS1_!(e
MRB1] K'Q>-#!ZI'Z4T>D+=?TQH_3!8*I']D:/JP^X]2/H31_>EO'T1H[\DI$d
"MC].:/O@^6]2/6*Q\8O+>_HS1YL,NZD=R:/F"3$2/I#1_9EOWTIH_6$G(D>M-c
M'^&2>B1W1H^\#+G$S'Q(Z"<?@$HE(Z?YCXSA_F/RH93?#_,>BG08_F/7)QU,b
M-ZP!ZT-Y,,,2\P_N S?KTQ[ T<?CW8)UW&*Q\=-A'C"8\<5<2.FI\=G4_KO3a
MCA^E4C/+!#UL@0NI E_R88)M:'G6@!_^.![,/.[ #<' WA"22\ .NB@9($/)z
M"A]>AX8%@&XQ,""'DA0^P0BT&"'DA0_5GJ4$/)BA^LB@9,$/)BA_;' @AY,4y
M/UIP((>3%#[$X$$/*"A[F*!E 0\H*']N<""'E!0_7' @AY04/[@X$$.T%#]?x
M% M 0[04/LC@00[04/V!P((=H*']R%W,8&'OQ;VV@(>5%#^ZD/(O]E00\J*'w
M]V<""'E10_O#@00\J*'V9P((>6%#]E% RP(>6%#[0X$$/+"A_?G @AY84/VAv
MP((=J*'^%% M00[44/VQP((=J*'VIP((=J*'[<X$$.@*'^)% H AT!0_QC@0u
M0Z H?Y!P((= 4/\DX$$.V%#_*B@6P(=L*'^6<""';"A_F' @AVPH?<G @AY<t
M4/NHH&7!#RXH?YIP((>7%#]T<""'EQ0_SS@00\P*'^A% S (>8%#_1.!!#S s
MH?Z1P((>8%#_3.!!#S(H?ZD4#,@AYD4/]8X$$/,BA^].!!#S(H?[)P((>:%#r
M_:B@9H$/-"A_N' @AYH4/]XX$$/-"A_OG @AYL4/O8H&;!#S8H?\!P((>;%#q
M]^<""'FQ0_XC@00\X*'_)% S@(><%#_F.!!#S@H?P#@00\X*'_2<""'G10^_p
MB@9T$/.BA_U' @AYT4/^LX$$/.BA_VG @AYX4/P8H&>!#SPH?PC@00\\*'OCo
M@00\\*'2.!!#SX(=FLB@9\$//@AV:XX$$//@AV; X$$//@AV;$X$$/0"A\/%n
M T (>@%#X@X$$/0"AXXX$$/0"AV1P((>A%#R,4#0@AZ$4/BC@00]"*'QAP((m
M>A%#XXX$$/1"AY**!H@0]$*'E#@00]$*'E3@00]$*':G @A\>*';<4#F7.HMl
M.I=5]<Z>.7=?8N;6OLG;IVAE;*SU3ROKM-:H3NEGD.=R62Y_(9+H$-)JD,[8k
M6%>A4O )Z=R3/NJ^U=/'2'%H,!N9<N^H>.JU#.6FJT]D\)_BJ]+IK1U8(5KIj
MXAG'7M-0Z=]2A?ZI0H-W:O+*PH4,YIJ_J+5"R$+46 )QVYM71,\Z>6#EW76Ci
MFQU#NN3H&HOZ_ V*5M7-I:ND+"O=Z>T)E'5II=-8.M0[KZ[Q1RHUX"1M;0E6h
M\LJYXYL;%T[K72'#U2H91U7UKK *.R?^TQ@-8+>$^AOH:6#H>=O":P6,!2?6g
M<*JX&NWNLW5L&M9NM=O:K@5G"5GX1]G!0A.(;B&BD.TE@[?+7RUNO:L^0?9Hf
M+[./U,M";PWPTW#?0F^IEK./07L^0?:LVZ\:O4KE1"BCT(3,)Z7\-#6%TPVOe
MM;ICV^7NF';.KIAN;Y%9L;[8;+8;+J]EW>,?)>F?[\=]XP?)>4_W"UPM16#;d
MV-P:*P>?DO^_/J7<J7B^>?J+<3>QW^QWX^]1;^<?J+>IWPF]GP=GP1]ZG?5%c
MOYA]MK:G?57 $WN;[<WP^]5P*G?-M;R3\Y>5G"K.$)ON>J[GJA]QYYR\\O!^b
M5/CAY4Q"\6?_$^)V"U@M1H'SS[UZ)N]97K(?=Z]\X^]>ZF6$V%',1]]3+/7Oa
MF'Z?5CEO$V_7/UP^XYCZ?5\D_2--'&:.,$V&+[6#[CSTC03X=)1IB:LD)9"7z
M0F,)DGM</']UB_8HL44___LR4A-22"L@KH+&"2"3OEFO6(K@ZI%_OXOVL&<Ay
M96'E8=LE;<&VWNNMMF' ^NWUVWO/^_'_2(4SAZX>P$H*E.-4F+U:]6TR]I_Sx
MY/VC.F7C5Z3%)/MJ<%* D*/0IF=)_KY?^1=_>#;>D%O.NMK;>A<*D-Q\XI3[w
M]K>MX+Z$^A)0[_8\H9:KUB_# ^_9T;;#5"^H7VRVV6]E&VRU%:X7N%[;#,Z-v
M2?QS[C+.,LC;HV_J'P(HY%&[VD:CZI\#.TX7^3\:C=HY'FGQL_&P4;#>:?&Xu
M4;C>:?MUMNMRR_+>F_^RV%PM['^]G^YV'JV_]BMN K_TCXO$7SQ,/ZY%E 4Vt
MW@MX;=)3<3042/:9E[@?(=.+O9!I(<X&VC6]2AN%[>"'=X8'DGU#H]K0\<^Fs
ML3Z"B88/%<IO6)ZO^5%<I/_D?R:>RE]PGOS#]^/+7\2C_YG\F.\&OXG/S#]_r
M7_-/^)[I8%U/D:(1%9MP[27MUB-BDDC8J\:(]IC)QC]Q'))7$=M@[8_MG*O'q
MR3_$KF)Q^6?XE<J<?'/C^WV QNF'%]=J'[C^,?_<;_1VG&/X1OM>]@,>8OU3p
M8HGEK_Q#?@<I?^.;[7NO*7\4WQU_A&Q]?)/X1L:!\D_A&^3;_%-\=?X1OD+_o
M]YOF8/__U_!?7L7:0_0_!JKFLW@[JKFID,I(9>0S%S5IZJKE2?QC^B\8_F^4n
M?T/C'\YRC^@\4_F_-/U?C'\_RS]7Q#]9YI_1<,_GOZ']"8_F_ZG]!Q#^\Y9^m
MKX9_/\P_5X!_HO[']$:OU+C^6?Z7!/Y[T#^@P3^?] _5X)^L]$_5X%G_I'\Sl
M@']YZ)_H8A_->F?S$0_5>H?RX'ZGAGUQ&)&2+5^W@#BO2A-P_Y(RAL82Z"LOk
M20"/UP==VCT9)Q1W6CN;K7[SP<AX4C?8>&PA+8*RS)=$#]X**W _?RKM%:IUj
M:$9X?H#I=V]NX>ZAW</=O=Q2J0TYS\D!9>AT1>$RAM1_0?"'*BW@-7[)%B/1i
?(7Y+I99K8+"%AX<C?9!+>0KK7V=S1W4DXCT6 =%! -1_h
lprozess.rsc GFA-Util
Autor:
@ KR
begin 644 PROZESS.LZH
M(6\M;&@U+:$ #D 6J7T'B "U!23UI%4U,N4E-#_0( CEMRV:5A?QC$z
M:OB0J-#]8ST:++XK0:C0;(K^PT!Q)L4FN\ &D<#'@<<!M^:,?2>AL!I, :QAy
M]N*74)A(/Z8Y(X00.44)G^!4\2%_HS!4$@S_%>"Y43EDK_Q_:U(]TQZZTM$1x
M83R(/,O1]7T([R'ICWU"3@PW%94UI=6&7KF;G]*W,[7D^\ZS:-Y][B-C3>7%w
MUW@WOV;:K;#:7DK:BW4\@"&A+6QH-2TS 0P %NE]!X@ M04D]:15-3v
M+DA21'_* "I*MHTH)W%3YGX<HL(BR8C;Z6HYT "$"*DD*?KF?!Q^1>+PV4FSu
MV]G7:3?[+G#:%%T (98M;&@U+84 "[ 6Z7T'B "U!23UI%4U,N3%-4t
M218 ?5*6H:45YT'O_<.N2HKEW XVD2SE,Y"'CQ6HP*H9MPW'>-25==. "5Hs
MI"W9Y1AT<#M\.>*,>K_+LQV]0%:ZKD66"637*E#!6::VDA=HU#CE#"-[8;#Or
M;?EWED]O90Q"2%W:06,70J</Q!FQP^=#[-.NU1R%WZ3&JY_HS3)Y(40O#_( q
! /EWp
lProtokolle GFA-Util
Drag & Drop:
.Font-Protokoll:
AV-Protokoll:
lDrag & Drop (nach Lorenz) GFA-Util
Autor:
0Alexander Lorenz @ N
Nachfolgend der Receiver-Teil der Routinen. Sie sind nicht besonders
n und schon gar nicht
bersichtlich :-)), aber sie funktionieren.
Es ist problemlos m
glich, auch den Sender-Teil in GFA zu
verwirklichen, nur mu
dieser relativ tief in den Source eingebunden
werden. Wenn die Zeit da ist, werde ich mich mal dransetzen, und
separate Routinen daraus machen.
' MultiTOS-Drag&Drop-Library
' Konstanten f
r D&D-Protokoll
Dd_ok&=0
Dd_nak&=1
Dd_ext&=2
Dd_len&=3
Dd_trash&=4
Dd_printer&=5
Dd_clipboard&=6
Dd_path$="U:\PIPE\DRAGDROP."
' Buffer f
r I/O-Routinen
Inline Buffer%,1024
' Die folgenden Zeilen geh
ren in die Event-Auswertung!!!
' -----------------
&Select Event&
Case 63
' AP_DRAGDROP
Handle&=Menu&(3)
F$=String$(2,Chr$(0))
Bmove V:Menu&(7),V:F$,2
Dd_receive(Handle&,F$,Daten$,Adr%,Len%)
If Adr%>0
Print "Empfangener Datentyp: ";Daten$
Print "
'Adresse: ";Adr%
Print "L
nge: ";Len%
'
' hier ggf. die Daten auswerten!
'
~
%Mfree(Adr%)
Else
Print "Keine Daten empfangen!"
Endif
Endselect
' -----------------
' Drag&Drop Receive-Routine
Procedure Dd_receive(Handle&,F$,Var Daten$,Mem%,Byte_len%)
' AP_DRAGDROP-Msg auswerten
' Handle& - Fensterhandle von AP_DRAGDROP
' F$ - Extension von AP_DRAGDROP
' Daten$ - Empfangener Datentyp ("ARGS" etc.)
' Mem% -
'Adresse der Daten
' Byte_len% - L
nge der Daten bzw. des Speicherblocks
Dd_open(Dd_path$+F$,File_hdl&)
If File_hdl&>0
'
' Protokoll starten
'
Dd_reply(File_hdl&,Dd_ok&)
'
' unsere Datentypen senden
'
Dd_datatypes(File_hdl&)
'
Dd_msg&=Dd_ext&
'
' einige Laufvariablen
'
Cnt%=0
Mem%=0
Byte_len%=0
'
Repeat
'
' Headerl
nge lesen
'
%Fread(File_hdl&,Buffer%,2)
If Return%>0
'
' Header lesen & auswerten
'
Len%=Min(Card{Buffer%},1024)
'
%Fread(File_hdl&,Buffer%,Len%)
If Return%>0
'
Daten$=String$(4,Chr$(0))
Bmove Buffer%,V:Daten$,4 !Datentyp
'
Byte_len%=Long{Buffer%+4} !Datenl
'
If Daten$=".
#GEM"
Dd_msg&=Dd_ok&
Else if Daten$=".IMG"
Dd_msg&=Dd_ok&
Else if Daten$=".GFA"
Dd_msg&=Dd_ok&
Else if Daten$=".TXT" Or Daten$=".ASC"
Dd_msg&=Dd_ok&
Else if Daten$=".LST"
Dd_msg&=Dd_ok&
Else if Daten$="ARGS"
Dd_msg&=Dd_ok&
Else if Daten$="PATH"
'
' Geh
rt das Fenster zu uns?
' (hier mu
rlich die Routine des
' eigenen Programms aufgerufen werden!)
'
Get_wind_opt(Handle&,W_nr%)
'
' W_nr% - >=0: Fenster geh
rt zu uns
' -1: Fenster geh
rt nicht zu uns
'
If W_nr%<>-1
If Wind_typ&(W_nr%)=1
'
' Dokumentfenster (Fenster hat einen Pfad)
'
Get_filename(Handle&,B$)
'
' B$ enth
lt jetzt den Pfad incl. Dateiname!
'
Dd_msg&=Dd_ok&
B$=Trim$(B$)+Chr$(0)
Else
Dd_msg&=Dd_nak&
Endif
Else
Dd_msg&=Dd_nak&
Endif
'
Else
Dd_msg&=Dd_ext&
Endif
'
If Dd_msg&>=0
'
If Dd_msg&=Dd_ok& And Daten$<>"PATH"
'
' Datenpuffer anfordern
'
Mem%=
&Malloc(Byte_len%,Mem%)
If Mem%<=0
Dd_msg&=Dd_len&
Endif
Endif
'
Dd_reply(File_hdl&,Dd_msg&)
'
If Dd_msg&=Dd_ok& And Daten$="PATH"
If Daten$="PATH"
'
' Fensterpfad senden
'
Char{Buffer%}=B$
&Fwrite(File_hdl&,Buffer%,Min(Len(B$),Len%))
Endif
Else if Dd_msg&=Dd_len&
Dd_datatypes(File_hdl&)
Endif
'
Inc Cnt%
'
Endif
'
Return%=1
'
Endif
Endif
'
Until Dd_msg&<=0 Or Cnt%>8 Or Return%<=0
'
' D&D ist ok bzw. wird abgebrochen
'
If Return%>0
If Cnt%>8 And Dd_msg&<>Dd_ok&
'
' Drag & Drop abbrechen
'
Dd_reply(File_hdl&,Dd_nak&)
Else if Dd_msg&=Dd_ok& And Cnt%<=8
'
' Daten aus Pipe lesen
'
If Mem%>0
%Fread(File_hdl&,Mem%,Byte_len%)
Endif
Endif
Endif
'
Dd_close(File_hdl&)
Endif
Return
' Drag&Drop Library
Procedure Dd_open(F$,Var File_hdl&)
%Fopen(F$,2,File_hdl&)
Return
Procedure Dd_close(File_hdl&)
&Fclose(File_hdl&)
Return
Procedure Dd_reply(File_hdl&,Flg&)
Byte{Buffer%}=Flg&
&Fwrite(File_hdl&,Buffer%,1)
Return
Procedure Dd_datatypes(File_hdl&)
Char{Buffer%}="ARGS"
Char{Buffer%+4}="PATH"
Char{Buffer%+8}=".
#GEM"
Char{Buffer%+12}=".IMG"
Char{Buffer%+16}=".GFA"
Char{Buffer%+20}=".TXT"
Char{Buffer%+24}=".ASC"
Char{Buffer%+28}=".LST"
&Fwrite(File_hdl&,Buffer%,32)
Return
Library
Procedure
%Fopen(Datei$,Flg%,Var File_hdl&)
Datei$=Datei$+Chr$(0)
Adr%=V:Datei$
File_hdl&=Gemdos(61,L:Adr%,W:Flg%)
Return
Procedure
&Fclose(File_hdl&)
Return%=Gemdos(62,W:File_hdl&)
Return
Procedure
%Fread(File_hdl&,Adr%,Flg%)
Return%=Gemdos(63,W:File_hdl&,L:Flg%,L:Adr%)
Return
Procedure
&Fwrite(File_hdl&,Adr%,Flg%)
Return%=Gemdos(64,W:File_hdl&,L:Flg%,L:Adr%)
Return
lDrag & Drop (nach R
ger) GFA-Util
Autor: Frank R
ger @ OS2
PROCEDURE menue_warten
'
2' #UMBRUCH ANFANG!
ev_mul&=EVNT_MULTI(mu_keybd&+mu_button&+mu_mesag&,258,3,0,0,
0,0,0,0,0,0,0,0,0,mbuf%,0,pmx&,pmy&,pmb&,pks&,pkr&,pbr&)
0' #UMBRUCH ENDE!
'
IF BTST(ev_mul&,mub_mesag&)
SELECT @mbuf(0)
CASE ap_dragdrop&
do_ap_dragdrop(WORD(@mbuf(7)))
ENDSELECT
ENDIF
'
LOOP
RETURN
PROCEDURE do_ap_dragdrop(dragdrop&)
LOCAL dummy!
LOCAL dummy$
CLR cmd$
IF @chk_pipe(dragdrop&,cmd$)
dd!=-1
dummy$=cmd$
~@cut_left_str(dummy$,cmd$)
IF LEN(cmd$)
IF EXIST(cmd$)<>0
IF UPPER$(RIGHT$(cmd$,4))=".SGI"
windup(beg_mctrl&)
menue_on(m.t.para&)
sgi_laden(cmd$)
windup(end_mctrl&)
ELSE
menue_on(m.t.datei&)
~@liste_laden(0,0,0,0,0,dummy!,dummy!)
ENDIF
menue_off
ELSE
2' #UMBRUCH ANFANG!
~@my_alert(note&,"Datei:|"+@pfad_format$(cmd$,40)+"|nicht
gefunden!",1,"Abbruch")
0' #UMBRUCH ENDE!
'
ENDIF
ENDIF
CLR dd!
ELSE
cmd$=TRIM$(cmd$)
IF LEN(cmd$)>40
cmd$=LEFT$(cmd$,40)+"|"+MID$(cmd$,41,40)
ELSE IF LEN(cmd$)=0
'
2' #UMBRUCH ANFANG!
cmd$="Keine! Evtl. gab es auch einen Fehler|bei der DragDrop-
Kommunikation (Pipe)!"
0' #UMBRUCH ENDE!
'
ENDIF
'
2' #UMBRUCH ANFANG!
~@my_alert(note&,"Sorry, SaugUtil unterst
tzt nur den|DragDrop-
Datentyp 'ARGS' (Listenname)!|Angeboten wurden leider nur
folgende:|"+cmd$,1,"Schade")
0' #UMBRUCH ENDE!
'
ENDIF
CLR cmd$
RETURN
FUNCTION chk_pipe(dragdrop&,VAR pipeliste$)
$F%
LOCAL pipehandle&
LOCAL pipemsglen&
LOCAL pipe$
' LOCAL pipedataname$
LOCAL pipemsg$
LOCAL pipemsglen$
pipe$="U:\PIPE\DRAGDROP."+MKI$(dragdrop&)
IF EXIST(pipe$)<>0
pipehandle&=@fopen(readwrite&,pipe$)
IF pipehandle&>-1
REPEAT
EXIT IF @fwrite(pipehandle&,CHR$(dd_ok&),0)
EXIT IF @fwrite(pipehandle&,"ARGS"+STRING$(28,0),0)
DO
EXIT IF @fread(pipehandle&,2,pipemsglen$)
pipemsglen&=CVI(pipemsglen$)
EXIT IF @fread(pipehandle&,pipemsglen&,pipemsg$)
IF INSTR(pipemsg$,"ARGS")=1
EXIT IF @fwrite(pipehandle&,CHR$(dd_ok&),0)
EXIT IF @fread(pipehandle&,CVL(MID$(pipemsg$,5)),pipeliste$)
~@fclose(pipehandle&,pipe$)
' pipedataname$=MID$(pipemsg$,9)
RETURN -1
ELSE
'
2' #UMBRUCH ANFANG!
pipeliste$=pipeliste$+STRING$(-
(LEN(pipeliste$)>0),"/")+LEFT$(pipemsg$,4)
0' #UMBRUCH ENDE!
'
EXIT IF @fwrite(pipehandle&,CHR$(dd_ext&),0)
ENDIF
LOOP
UNTIL -1
~@fclose(pipehandle&,pipe$)
ENDIF
ENDIF
RETURN 0
ENDFUNC
Bemerkungen dazu:
1. FUNCTION mbuf(i&) liefert das entsprechende WORD aus dem
Messagebuffer, den ich mit M[x]alloc() alloziere.
2. dd! und cmd$ sind globale Variablen f
r meine Ladefunktion.
Wichtig ist, da
chk_pipe() in VAR pipeliste$ die Kommandozeile
liefert, wenn alles klappt! Sonst enth
lt pipeliste$ eine Liste
der angebotenen Datentypen (<>"ARGS").
3. FUNCTION cut_left_str(VAR in$,out$) arbeitet
hnlich, wie die C-
Funktion strtok() mit dem Trennzeichen " " (Space) und liefert
als Return die L
nge von out$. In out$ steht anschlie
end der
erste String aus in$ von links bis zum ersten Space (oder in$,
falls kein Space enthalten ist) und in in$ der Rest von in$ nach
dem Abschneiden von out$. Ach was soll's(!smile) Hier ist das
auch noch:
(K
nnte man nat
rlich wie strtok() noch auf andere Trennzeichen
ausweiten.)
4. chk_pipe() liefert eine 0, wenn nicht der Datentyp ARGS
(Kommandozeile) vorliegt oder sonst ein Fehler mit der Pipe
auftritt, und ist auch nur f
r ARGS ausgelegt (ich glaube, ich
dreh das nochmal um, damit im Fehlerfall ein Wert <>0 k
mmt).
5. Die symbolischen Konstanten entsprechen ihren gro
Namensbr
dern aus der C-Welt (DD_OK, DD_EXT, usw.).
6. Die fxxxx()-Funktionen rufen die entsprechenden
-I/O-
Funktionen auf und liefern im Fehlerfall einen Wert <>0
(Fehlerbehandlung ist in den Funktionen enthalten). Die letzte 0
bei fwrite() hei
t 'kein CRLF'.
7. Den genauen Durchblick habe ich da im Moment auch nicht mehr,
aber ich wei
ich's irgendwann selbst programmiert habe und
da
es funktioniert(!smile)
Bei Fragen kann ich mir das Protokoll ja nochmal genauer angucken!
lxacc_mtosinit GFA-Util
Autor:
,Reiner Rosin @ WI2
PROCEDURE xacc_mtosinit
LOCAL puffer,mode
INLINE puffer,20
mode=0
'
GCONTRL(0)=18
GCONTRL(1)=1
GCONTRL(2)=3
GCONTRL(3)=1
GCONTRL(4)=0
GINTIN(0)=mode
ADDRIN(0)=puffer
'
GEMSYS
'
EXIT IF GINTOUT(0)<>1
'
PRINT "ID: ";+GINTOUT(2);" ";LEFT$(CHAR{puffer}+" ",10);"Typ:";GINTOUT(1)
'
ENDIF
'
mode=1
LOOP
RETURN
8Aktuellen Pfad ermitteln
JBei bestehender Datei die Extension
ndern
;Blinken der Laufwerkslampen
?Datei kopieren (nach Duchalski)
>Datei kopieren1 (nach Gruszka)
>Datei kopieren2 (nach Gruszka)
5Datei-Infos ermitteln
9Dateiextender extrahieren
/Disknamen lesen
3Disknamen schreiben
?Existenz eine Laufwerkes pr
fen
<Existenz eine Ordners pr
fen
NExtender zwangsweise(!) vorgeben (nach Harder)
OExtender zwangsweise(!) vorgeben (nach Wedding)
>Extrahiert den Pfad ohne Datei
CExtrahiert die Datei aus einem Pfad
4FASTLOAD-Flag setzen
8FASTLOAD-Flag
berpr
fen
5Filenamen formatieren
te Versionsnummer verschiedener Files ausgeben
*k2_adresse
(k2_close
'k2_copy
0k2_copy_and_quit
)k2_delete
2k2_delete_and_quit
)k2_dialog
-k2_dst_select
'k2_err$
'k2_exec
'k2_exit
'k2_init
-k2_init_texte
)k2_konfig
)k2_select
-k2_src_select
ELange Dateinamen k
rzen (nach Dunkel)
ELange Dateinamen k
rzen (nach Klasen)
DLange Dateinamen k
rzen (nach R
ger)
4Schreibschutz testen
5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@*
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@*
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@
UUUU@
UUUUP
UUUUU@*
UUUUU@
UUUUU@
UUUUW
UUUUU@*
UUqUUZ
UUUUU
UUUUU@*
UU]UUJ
UUUUUj
UUa_U^
UUUUU@e
UU]UUo
UUUUUj
UUa]U^
UUUUU@*
UU]UU'
UUUUUj
UUa]U^
UUUUU@
UUUUU
UUUUUj
UUaUU^
UUUUU@
UUUUU
UVUUT
UUUUUj
UUaUU^
UUUUU@*
UUUUU
URUUV
UUUUj
UUaUU^
UUUUU@i
UUUUj
UUaUU^
UUUUU@i
UUZUz
UUUUj
UUaUU^
UUUUU@i
U^UUIUz
UUUUj
UUaUU^
UUUUU@a
UWUUh
UUaUU^
UUUUU@e
UWUU%U^
UUaUU^
UUUUU@
UUeUU^
UUUUU@o
UUEUU@m
UUUUz
UUZUUU
/UUUZ
UUU@*
UUU@*
UUUU_
UUUUW
UUU@x
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@*
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@n
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU@m
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU\